【结构型】装饰器模式

noah2021

设计模式|2021-7-2|最后更新: 2024-9-21|
type
status
date
slug
summary
tags
category
icon
password

意图

为对象动态添加功能
它的优点是:
  • 装饰类和被装饰类可以独立发展,不会相互耦合,装饰器模式是继承的一个替代模式,装饰器模式可以动态扩展一个实现类的功能
缺点:
  • 多层装饰比较复杂

类图

装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象
notion image

在JDK中的应用

Java 的 IO 结构,FilterInputStream 属于抽象装饰者:
notion image
装饰者用于装饰组件,为组件提供额外的功能。实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。
DataInputStream 装饰者提供了对更多数据类型进行输入的操作,比如 int、double 等基本类型

实战案例

通过使用装饰器组装类实现返回失败信息给前端:由于EmBusinessErrorBusinessException都继承了CommonErr接口,达到不用新建EmBusinessErrorBusinessException的类就可获得errCodeerrMsg的组装类,同时接口里面的setErrMsg还达到可以替换原本的errMsg进行自定义的功能
  1. CommonErr接口的实现
  1. EmBusinessError的实现
  1. BusinessException的实现
  1. 实现UserController

特点

  1. 装饰者和组件具有组合关系,装饰者和具体组件继承同样的父类(组件类),因此装饰者可以装饰其他装饰者或者具体组件。
  1. 我们可以对被装饰者“嵌套”多个装饰者(或者装饰者套在多个被装饰者身上)进行功能拓展;
  1. 装饰者是对功能的增强,这也是装饰器模式应用场景的一个重要特点。实际上,符合“组合关系”这种代码结构的设计模式有很多,比如代理模式、桥接模式,还有现在的装饰器模式。尽管它们的代码结构很相似,但是每种设计模式的意图是不同的。就拿比较相似的代理模式和装饰器模式来说吧,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能
Loading...