1. 装饰器模式(Decorator、Wrapper(包装) Pattern)

  • 适配器是连接两个类,可以增强一个类装饰器是增强一个类

  • 向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。

  • 创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

10. 装饰器模式(Decorator、Wrapper(包装) Pattern) - 图1

  • 抽象构件(Component)角色:

    • 定义一个抽象接口以规范准备接收附加责任的对象。
      1. /**
      2. *抽象构件
      3. */
      4. public interface ManTikTok {
      5. void tiktok();
      6. }
  • 具体构件(ConcreteComponent)角色:

    • 实现抽象构件,通过装饰角色为其添加一些职责。
      1. public class MiTikTok implements ManTikTok {
      2. @Override
      3. public void tiktok() {
      4. System.out.println("雷军在抖音直播中");
      5. }
      6. }
  • 抽象装饰(Decorator)角色:

    • 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
      1. /**
      2. * 抽象装饰
      3. */
      4. public interface TiktokDecorator extends ManTikTok{
      5. void enable();
      6. }
  • 具体装饰(ConcreteDecorator)角色:

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

      1. /**
      2. * 装饰器只关心增强这个类的方法
      3. */
      4. public class MeiYanDecorator implements TiktokDecorator{
      5. //装饰谁?
      6. private ManTikTok manTikTok;
      7. public MeiYanDecorator(ManTikTok manTikTok) {
      8. this.manTikTok = manTikTok;
      9. }
      10. @Override
      11. public void tiktok() {
      12. //保留之前的功能
      13. manTikTok.tiktok();
      14. //开启增强功能
      15. enable();
      16. }
      17. //定义了增强功能
      18. @Override
      19. public void enable() {
      20. System.out.println("开启推广直播间");
      21. }
      22. }

测试方法

  1. public static void main(String[] args) {
  2. //被装饰对象
  3. MiTikTok miTikTok = new MiTikTok();
  4. miTikTok.tiktok();
  5. MeiYanDecorator decorator = new MeiYanDecorator(miTikTok);
  6. decorator.tiktok();
  7. }

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?

  • 已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。