描述

  • 适配器是连接两个类,可以增强一个类,装饰器是增强一个类
  • 向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。
  • 创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

image.png

主要角色

  • 抽象构件(Component)角色:
    • 定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:
    • 实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator)角色:
    • 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator)角色:

    • 实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

      代码实现

      ```java public abstract class AbstractTranslation {

      abstract void translation();

}

  1. ```java
  2. public class ZH_Translation extends AbstractTranslation{
  3. @Override
  4. void translation() {
  5. System.out.println("你好");
  6. }
  7. }
  1. public abstract class TranslationWrapper {
  2. abstract void translationWrapper();
  3. }
  1. public class JP_TranslationWrapper extends TranslationWrapper{
  2. private AbstractTranslation translation;
  3. public JP_TranslationWrapper(AbstractTranslation translation) {
  4. this.translation = translation;
  5. }
  6. @Override
  7. void translationWrapper() {
  8. translation.translation();
  9. apply();
  10. }
  11. private void apply(){
  12. System.out.println("增强开始=》空你几哇");
  13. }
  14. }
  1. public class WrapperTest {
  2. public static void main(String[] args) {
  3. ZH_Translation zh_translation = new ZH_Translation();
  4. zh_translation.translation();
  5. JP_TranslationWrapper jp_translationWrapper = new JP_TranslationWrapper(zh_translation);
  6. jp_translationWrapper.translationWrapper();
  7. }
  8. }
  9. //测试输出
  10. //你好
  11. //你好
  12. //增强开始=》空你几哇

使用场景

什么场景使用?

  • 无处不在….. SpringSession中如何进行session与redis关联?HttpRequestWrapper
  • session:数据存在了内存
  • session:数据存在redis
  • HttpSession;getAttribute();
  • Wrapper(session){ getAttribute(String param){ redis.get(param) }; }
  • MyBatisPlus提取了QueryWrapper,这是什么?
  • Spring中的BeanWrapper是做什么?包装了Bean。bean的功能增强?
  • Spring Webflux中的 WebHandlerDecorator?
  • 已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。 ……

补充

装饰器和适配器非常相似。
装饰器起到对目标类增强的作用,具体增强的内容在自己内部实现,不需要借助其他第三方类
而适配器是在连接第三方类来实现对目标类的增强