设计模式-装饰者 | 8lovelife's life
0%

设计模式-装饰者

装饰者模式可以在不影响原对象结构的情况下,在运行时动态的添加、增强或删除对象的行为或状态。当然通过继承类的方式也可以扩展类的行为和状态,但这种扩展是在编译期间完成的,无法做到动态扩展,使用继承来扩展类很容易导致类的数量爆增。装饰者模式可以提高系统的灵活性和扩展性,该模式在 Java IO 中经常被使用,如:FileReader、BufferedReader 等。本篇文章将以博客发布为例,来说明装饰者设计模式的特点

简单实现

下图展示了博客文章支持发布到不同平台的简单架构实现,通过继承的方式进行博客发布平台的扩展

imag

这种架构抽象方式非常简单,不同发布平台的扩展也很容易。但如果我想多个平台一起发布博客内容呢?我们在此基础上扩展试试看。同时在个人网站和CSDN发布、同时在知乎和CSDN发布

imag

如果现在需要同时在所有平台发布博客内容呢?类继承方式的扩展会导致类的数量急速增加,同时过多功能的组合也导致类方法的职责过多,违反了 SRP 设计原则,这样的代码不够整洁,这也使得系统难以维护

装饰者模式

装饰者模式是一种结构型设计模式,主要包含如下几个部分

  • Component: 抽象组件,可以是抽象类或接口
  • ConcreteComponent: 具体组件,具体行为状态的对象
  • Decorator: 抽象装饰者,是所有具体装饰者的基类
  • ConcreteDecorator: 具体装饰者,实现了Decorator,并添加了一些附加的行为和状态

imag

这里的 Client 表示使用方,使用方依赖抽象而不是具体实现,这同时也符合 DIP 设计原则。我们来看看通过装饰者实现,如何体现出更好的系统灵活性

imag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 个人网站发布
Blog blog = new PersonalWebsite();
blog.publish();

// 知乎和个人网站发布
blog = new ZhihuDecorator(blog);
blog.publish();

// CSDN、知乎和个人网站发布
blog = new CSDNDecorator(blog);
blog.publish();

// 微信公众号、CSDN、知乎和个人网站发布
blog = new WechatDecorator(blog);
blog.publish();

应用场景

装饰者模式常见应用场景

  1. 为一个对象提供多层次的功能扩展
  2. 动态且透明的处理对象的行为或状态