type
status
date
slug
summary
tags
category
icon
password
意图
为对象动态添加功能
它的优点是:
- 装饰类和被装饰类可以独立发展,不会相互耦合,装饰器模式是继承的一个替代模式,装饰器模式可以动态扩展一个实现类的功能
缺点:
- 多层装饰比较复杂
类图
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象
在JDK中的应用
Java 的 IO 结构,FilterInputStream 属于抽象装饰者:
装饰者用于装饰组件,为组件提供额外的功能。实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。
DataInputStream 装饰者提供了对更多数据类型进行输入的操作,比如 int、double 等基本类型
实战案例
通过使用装饰器组装类实现返回失败信息给前端:由于
EmBusinessError
和BusinessException
都继承了CommonErr
接口,达到不用新建EmBusinessError
和BusinessException
的类就可获得errCode
和errMsg
的组装类,同时接口里面的setErrMsg
还达到可以替换原本的errMsg
进行自定义的功能CommonErr
接口的实现
EmBusinessError
的实现
BusinessException
的实现
- 实现
UserController
特点
- 装饰者和组件具有组合关系,装饰者和具体组件继承同样的父类(组件类),因此装饰者可以装饰其他装饰者或者具体组件。
- 我们可以对被装饰者“嵌套”多个装饰者(或者装饰者套在多个被装饰者身上)进行功能拓展;
- 装饰者是对功能的增强,这也是装饰器模式应用场景的一个重要特点。实际上,符合“组合关系”这种代码结构的设计模式有很多,比如代理模式、桥接模式,还有现在的装饰器模式。尽管它们的代码结构很相似,但是每种设计模式的意图是不同的。就拿比较相似的代理模式和装饰器模式来说吧,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。