1. 装饰器模式(Decorator、Wrapper(包装) Pattern)
适配器是连接两个类,可以增强一个类,装饰器是增强一个类
向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。
创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
抽象构件(Component)角色:
- 定义一个抽象接口以规范准备接收附加责任的对象。
/**
*抽象构件
*/
public interface ManTikTok {
void tiktok();
}
- 定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:
- 实现抽象构件,通过装饰角色为其添加一些职责。
public class MiTikTok implements ManTikTok {
@Override
public void tiktok() {
System.out.println("雷军在抖音直播中");
}
}
- 实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:
- 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
/**
* 抽象装饰
*/
public interface TiktokDecorator extends ManTikTok{
void enable();
}
- 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:
实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
/**
* 装饰器只关心增强这个类的方法
*/
public class MeiYanDecorator implements TiktokDecorator{
//装饰谁?
private ManTikTok manTikTok;
public MeiYanDecorator(ManTikTok manTikTok) {
this.manTikTok = manTikTok;
}
@Override
public void tiktok() {
//保留之前的功能
manTikTok.tiktok();
//开启增强功能
enable();
}
//定义了增强功能
@Override
public void enable() {
System.out.println("开启推广直播间");
}
}
测试方法
public static void main(String[] args) {
//被装饰对象
MiTikTok miTikTok = new MiTikTok();
miTikTok.tiktok();
MeiYanDecorator decorator = new MeiYanDecorator(miTikTok);
decorator.tiktok();
}
2. 应用场景
无处不在…..
SpringSession中如何进行session与redis关联?HttpRequestWrapper
session:数据存在了内存
session:数据存在redis
HttpSession;getAttribute();
```java Wrapper(session){
getAttribute(String param){ redis.get(param) };
} ```
MyBatisPlus提取了QueryWrapper,这是什么?
Spring中的BeanWrapper是做什么?包装了Bean。bean的功能增强?
Spring Webflux中的 WebHandlerDecorator?
已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。