描述
- 适配器是连接两个类,可以增强一个类,装饰器是增强一个类
- 向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。
- 创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
主要角色
- 抽象构件(Component)角色:
- 定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:
- 实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:
- 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:
}
```java
public class ZH_Translation extends AbstractTranslation{
@Override
void translation() {
System.out.println("你好");
}
}
public abstract class TranslationWrapper {
abstract void translationWrapper();
}
public class JP_TranslationWrapper extends TranslationWrapper{
private AbstractTranslation translation;
public JP_TranslationWrapper(AbstractTranslation translation) {
this.translation = translation;
}
@Override
void translationWrapper() {
translation.translation();
apply();
}
private void apply(){
System.out.println("增强开始=》空你几哇");
}
}
public class WrapperTest {
public static void main(String[] args) {
ZH_Translation zh_translation = new ZH_Translation();
zh_translation.translation();
JP_TranslationWrapper jp_translationWrapper = new JP_TranslationWrapper(zh_translation);
jp_translationWrapper.translationWrapper();
}
}
//测试输出
//你好
//你好
//增强开始=》空你几哇
使用场景
什么场景使用?
- 无处不在….. 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?
- 已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。 ……
补充
装饰器和适配器非常相似。
装饰器起到对目标类增强的作用,具体增强的内容在自己内部实现,不需要借助其他第三方类
而适配器是在连接第三方类来实现对目标类的增强