装饰者模式可以在不影响原对象结构的情况下,在运行时动态的添加、增强或删除对象的行为或状态。当然通过继承类的方式也可以扩展类的行为和状态,但这种扩展是在编译期间完成的,无法做到动态扩展,使用继承来扩展类很容易导致类的数量爆增。装饰者模式可以提高系统的灵活性和扩展性,该模式在 Java IO 中经常被使用,如:FileReader、BufferedReader 等。本篇文章将以博客发布为例,来说明装饰者设计模式的特点
简单实现
下图展示了博客文章支持发布到不同平台的简单架构实现,通过继承的方式进行博客发布平台的扩展
这种架构抽象方式非常简单,不同发布平台的扩展也很容易。但如果我想多个平台一起发布博客内容呢?我们在此基础上扩展试试看。同时在个人网站和CSDN发布、同时在知乎和CSDN发布
如果现在需要同时在所有平台发布博客内容呢?类继承方式的扩展会导致类的数量急速增加,同时过多功能的组合也导致类方法的职责过多,违反了 SRP 设计原则,这样的代码不够整洁,这也使得系统难以维护
装饰者模式
装饰者模式是一种结构型设计模式,主要包含如下几个部分
- Component: 抽象组件,可以是抽象类或接口
- ConcreteComponent: 具体组件,具体行为状态的对象
- Decorator: 抽象装饰者,是所有具体装饰者的基类
- ConcreteDecorator: 具体装饰者,实现了Decorator,并添加了一些附加的行为和状态
这里的 Client 表示使用方,使用方依赖抽象而不是具体实现,这同时也符合 DIP 设计原则。我们来看看通过装饰者实现,如何体现出更好的系统灵活性
1 | // 个人网站发布 |
应用场景
装饰者模式常见应用场景
- 为一个对象提供多层次的功能扩展
- 动态且透明的处理对象的行为或状态