设计模式--装饰器模式【结构型模式】

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式系列文章传送门

设计模式的 7 大原则

设计模式--单例模式【创建型模式】

设计模式--工厂方法模式【创建型模式】

设计模式--抽象工厂模式【创建型模式】

设计模式--建造者模式【创建型模式】

设计模式--原型模式【创建型模式】

设计模式--适配器模式【结构型模式】

什么是装饰器模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能,而不改变其结构和实现,它在运行时给对象动态地添加一些额外的职责,装饰者模式通过装饰来实现功能的扩展,装饰器的核⼼就是在不改原有类的基础上给类新增功能。

装饰着模式的组成

  • 抽象构件(Component):被装饰者对象需要实现的一个抽象接口或抽象类。
  • 具体构件(ConcreteComponent):一个具体的对象,就是需要被装饰的对象。
  • 抽象装饰器(Decorator):持有一个抽象构件对象的引用,并且可以动态给该对象添加新的功能。
  • 具体装饰器(ConcreteDecorator):实现具体的装饰器,向真实的构件对象添加新功能。

装饰器模式实现

我们再次使用车来做为演示的实物载体,生活中我们买了爱车之后,除了 4S 店交付的新车,我们把车开回家之后,还会对车进行一番装饰0例如地垫、儿童座椅、360 安全影像等等,而这些都属于对爱车的装饰,也就是具体的装饰器,而我们的爱车就是抽象组件。

MyCar(抽象构件)

我们以车为抽象构件,代码如下:

java 复制代码
public interface MyCar {

    //装饰车
    String decorativeCar();

}

MyCarDecorator(具体构件)

我们有了爱车之后需要对爱车进行内饰装饰,内饰装饰就是具体的构件,代码如下:

java 复制代码
public interface MyCar {

    //装饰车
    String decorativeCar();

}

InteriorDecorator(抽象装饰器)

我们对爱车内饰装饰定义一个抽象装饰器,代码如下:

java 复制代码
public abstract class InteriorDecorator implements MyCar {

    private MyCar myCar;

    public InteriorDecorator(MyCar myCar) {
        this.myCar = myCar;
    }

    @Override
    public String decorativeCar() {
        return "爱车装饰";
    }
}

FloorMatDecorator(具体装饰器)

我们定义一个具体的地垫装饰器,代码如下:

java 复制代码
public class FloorMatDecorator extends InteriorDecorator {
    public FloorMatDecorator(MyCar myCar) {
        super(myCar);
    }

    @Override
    public String decorativeCar() {
        return "爱车装饰地垫";
    }
}

ChildSeatDecorator(具体装饰器)

我们定义一个具体的儿童座椅装饰器,代码如下:

java 复制代码
public class ChildSeatDecorator extends InteriorDecorator {

    public ChildSeatDecorator(MyCar myCar) {
        super(myCar);
    }

    @Override
    public String decorativeCar() {
        return "爱车装饰儿童座椅";
    }
}

客户端验证

我们进行装饰器模式案例验证,代码如下:

java 复制代码
public class ClientDecorator {

    public static void main(String[] args) {
        //具体组件
        MyCarDecorator myCarDecorator = new MyCarDecorator();
        //具体装饰器 地垫装饰
        FloorMatDecorator floorMatDecorator=new FloorMatDecorator(myCarDecorator);
        String floor = floorMatDecorator.decorativeCar();
        System.out.println(floor);
        //具体装饰器 儿童座椅
        ChildSeatDecorator childSeatDecorator=new ChildSeatDecorator(myCarDecorator);
        String childSeat = childSeatDecorator.decorativeCar();
        System.out.println(childSeat);

    }

}

验证结果如下:

powershell 复制代码
爱车装饰地垫
爱车装饰儿童座椅

以上我们就完成了装饰器模式的演示,装饰器解决了直接继承下因功能的不断横向扩展导致⼦类数量膨胀的问题,使用装饰器模式后就会⽐直接继承显得更加灵活,同时也无需再考虑⼦类的维护。

装饰器模式的优缺点

优点:

  • 符合单一职责原则,每个具体装饰器类只负责增加一种功能,类的职责单一。
  • 灵活可扩展,可以动态地为对象添加新的功能。
  • 使用装饰器对象,可以避免因继承导致的⼦类数量膨胀的问题。

优点:

  • 会产生较多的对象,让系统变的更复杂,同时设计模式的使用考验研发人员的抽象能力和系统设计能力。

装饰器模式使用场景

  • Java 中数据流处理中的输入输出流是装饰者模式的经典应用。
  • 结合场景分析,没有万能的设计模式。。。

如有不正确的地方欢迎各位指出纠正。

相关推荐
AC赳赳老秦5 分钟前
企业级合规审计体系:用 OpenClaw 落地采集全链路留痕,自动生成合规审计报告
java·python·django·beautifulsoup·php·deepseek·openclaw
吃杠碰小鸡1 小时前
VsCode中开发Java项目
java·vscode
宠友信息1 小时前
内容社区源码开发实践解析,用Spring Boot打造1:1仿小红书源码平台
java·spring boot·redis·websocket·mysql·spring·uni-app
行百里er1 小时前
加个依赖就生效?一行搞定 Spring Boot Starter 自动装配
java·后端·监控
月华路2 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
净重21克2 小时前
万字长文!TLS协议升级避坑手册:JDK老项目适配TLS1.2/1.3全流程拆解
java·springboot·java安全
一直C2 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
paopaokaka_luck2 小时前
基于springboot3+vue3的车间生产管理系统(Echarts图形化分析、BI报表)
java·前端·spring boot·学习·echarts
众人皆醒我独醉2 小时前
自动扩缩容:KPA/HPA/KEDA 三条路径
面试·kubernetes·llm