为什么用结构性模式?
结构性模式
关注点“怎样组合对象/类
?”所以我们关注下类的组合关系类结构型模式
关心类的组合,由多个类可以组合成一个更大的(继承)对象结构型模式
关心类与对象的组合,通过关联关系
在一个类中定义另一个类的实例对象(组合)- 根据“
合成复用原则
”,在系统中尽量使用关联关系来替代继承关系
,因此大部分结构型模式都是对象结构型模式
。
- 适配器模式(Adapter Pattern):两个不兼容接口之间适配的桥梁。
- 桥接模式(Bridge Pattern):相同功能抽象化与实现化解耦,抽象与实现可以独立升级。
- 过滤器模式(Filter、Criteria Pattern):使用不同的标准来过滤一组对象。
- 组合模式(Composite Pattern):相似对象进行组合,形成树形结构。
- 装饰器模式(Decorator Pattern):向一个现有的对象添加新的功能,同时又不改变其结构。
- 外观模式(Facade Pattern):向现有的系统添加一个接口,客户端访问此接口来隐藏系统的复杂性。
- 享元模式(Flyweight Pattern):尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
- 代理模式(Proxy Pattren):一个类代表另一个类的功能。
🍭结构性模式之装饰器模式(Decorator/Wrapper Pattern)
🍎定义
-
向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。
-
创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
-
适配器是连接两个类,可以增强一个类。装饰器是增强一个类。
- 抽象构件(Componment)角色:定义一个抽象接口以规范准备接收附加责任的对象
- 具体构件(ConcreteComponment)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构建,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的具体方法,并给具体构件对象添加附加的责任。
🍔代码实现
/**
* 抽象构建
*/
public interface ManTikTok {
void tikTok();
}
public class ZhuiTikTok implements ManTikTok {
@Override
public void tikTok() {
System.out.println("张三在直播.....");
}
}
/**
* 抽象装饰器
* 抖音直播装饰器
* 装饰器只关系增强这个类的方法
*/
public interface TikTokDecorator extends ManTikTok {
void enableMeiYan();
}
/**
* 美颜装饰器
* 装饰器装饰谁
*/
public class MeiYanDecorator implements TikTokDecorator {
ManTikTok manTikTok;
public MeiYanDecorator(ManTikTok manTikTok) {
this.manTikTok = manTikTok;
}
@Override
public void tikTok() {
// 开启
this.enableMeiYan();
manTikTok.tikTok();
}
/**
* 定义的增强功能
*/
@Override
public void enableMeiYan() {
System.out.println("鲜花一大片.....");
}
}
public class MainTest {
public static void main(String[] args) {
// 被装饰对象
ZhuiTikTok manTikTok = new ZhuiTikTok();
TikTokDecorator tikTokDecorator = new MeiYanDecorator(manTikTok);
tikTokDecorator.tikTok();
}
}
鲜花一大片.....
张三在直播.....
已存在的类,某一天想使用某个功能使用的时候发现不够,就可以使用装饰器。
🍕应用场景
- 什么场景用到?
- 这个模式无处不在
- SpringSession 中如何进行 session 与 redis 关联?HttpRequestWrapper
- MybatisPlus 提取 QueryWrapper,是什么?
- Spring 中的 BeanWrapper 是做什么?
- Spring Webflux 中的 WebHandlerDecorator?