设计模式之装饰器模式(Decorator/Wrapper Pattern)【结构性模式】

在这里插入图片描述

为什么用结构性模式?

  • 结构性模式关注点“怎样组合对象/类?”所以我们关注下类的组合关系
  • 类结构型模式关心类的组合,由多个类可以组合成一个更大的(继承)
  • 对象结构型模式关心类与对象的组合,通过关联关系在一个类中定义另一个类的实例对象(组合)
  • 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式
  1. 适配器模式(Adapter Pattern):两个不兼容接口之间适配的桥梁。
  2. 桥接模式(Bridge Pattern):相同功能抽象化与实现化解耦,抽象与实现可以独立升级。
  3. 过滤器模式(Filter、Criteria Pattern):使用不同的标准来过滤一组对象。
  4. 组合模式(Composite Pattern):相似对象进行组合,形成树形结构。
  5. 装饰器模式(Decorator Pattern):向一个现有的对象添加新的功能,同时又不改变其结构。
  6. 外观模式(Facade Pattern):向现有的系统添加一个接口,客户端访问此接口来隐藏系统的复杂性。
  7. 享元模式(Flyweight Pattern):尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
  8. 代理模式(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?
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值