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

概述

装饰器模式 : Decorator Pattern : 是一种结构型设计模式.
作用 : 允许你动态地给对象添加功能或职责,而无需修改其原始类的代码,非常的符合 开闭原则。
实现思路 :通过创建一个包装对象(即装饰器),来包裹原始对象,并在运行时动态地为这个对象增加新的行为。

简单理解 : 就是一层一层的包装起来。

核心思想

1、开放封闭原则 :软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。

装饰器模式很好地体现了这一原则,它允许我们在不改变已有代码的情况下,通过添加新的装饰器类来扩展功能。

2、避免继承层次过多:如果使用继承来实现功能扩展,可能会导致子类数量爆炸式增长。而使用装饰器模式可以有效地减少这种复杂性。

主要角色

1、Component(组件) :定义了被装饰的对象接口,可以是一个具体类或抽象类。

2、ConcreteComponent(具体组件) :实现了Component接口的具体类,是我们希望装饰的对象。

3、Decorator(装饰器) :持有一个Component对象的引用,并且定义了一个与Component相同的接口,使得Decorator可以替代具体的组件。

4、ConcreteDecorator(具体装饰器):实现了Decorator接口,并在其基础上添加了额外的行为或功能。

情景模式

1、有一些企业是 做电子产品的,可以生产各种各样的电子产品 - 抽象的组件 ;

2、有一家企业是 专门生产电脑的 - 具体的组件 ;

3、有一些企业是做 音响的,可以给电脑配置音响 - 装饰器 ;

4、有一家企业是 专门给电脑定制音响的 - 具体装饰器 。

5、有一些企业是做 软件的,可以给电脑安装软件 - 装饰器 ;

6、有一家企业是 专门给电脑做 聊天软件的 - 具体的装饰器。

类图

案例代码

被装饰者-组件

接口类

java 复制代码
public interface ElectronProduct {
    void generatElectronProduct();
}

具体实现类

java 复制代码
public class ComputerProduct implements ElectronProduct{
    @Override
    public void generatElectronProduct() {
        System.out.println("生产电脑。。。");
    }
}

装饰器

抽象类/基类

java 复制代码
public abstract class ELectronicDecorator implements ElectronProduct{

    protected ElectronProduct electronProduct;

    public ELectronicDecorator(ElectronProduct electronProduct) {
        this.electronProduct = electronProduct;
    }

    // 对接口中的方法进行实现,也可以做成抽象的
    @Override
    public void generatElectronProduct() {
        electronProduct.generatElectronProduct();
    }
}

具体实现类-可以有多个

java 复制代码
public class ComputerDecorator extends ELectronicDecorator{
    public ComputerDecorator(ElectronProduct electronProduct) {
        super(electronProduct);
    }

    @Override
    public void generatElectronProduct() {
        electronProduct.generatElectronProduct();
        System.out.println("增加电脑装饰-安装软件");
    }
}
java 复制代码
public class ComputerDecorator2 extends ELectronicDecorator{
    public ComputerDecorator2(ElectronProduct electronProduct) {
        super(electronProduct);
    }

    @Override
    public void generatElectronProduct() {
        electronProduct.generatElectronProduct();
        System.out.println("增加电脑装饰-增强音响");
    }
}

测试类

java 复制代码
public class Test {
    public static void main(String[] args) {
        // 1、最原始的对象
        ElectronProduct electronProduct = new ComputerProduct();
        electronProduct.generatElectronProduct(); // 原生的方法
        System.out.println(" =============== ");

        // 2、添加一层装饰
        ELectronicDecorator eLectronicDecorator = new ComputerDecorator(electronProduct);
        eLectronicDecorator.generatElectronProduct(); // 装饰器对象的方法,将原来的方法进行了增强
        System.out.println(" =============== ");

        // 3、再多一层装饰
        ELectronicDecorator eLectronicDecorator2 = new ComputerDecorator2(eLectronicDecorator);
        eLectronicDecorator2.generatElectronProduct();

        // 后续还可以继续添加装饰

    }
}
复制代码
运行结果:
生产电脑。。。
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响
相关推荐
长按助力退休2 小时前
设计模式实战,这 5 个最常用
设计模式
Carl_奕然4 小时前
【智能体】Agent的四种设计模式之:Multi-Agent Collaboration
设计模式
Lost of 程序猿4 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
SL_staff4 小时前
合规性折旧:当知识资产因主权缺位在审计中‘功能性清零’
java·设计模式·开源
Zane19949 小时前
工厂方法一定比简单工厂高级?三种工厂模式到底该怎么选
设计模式
Hespethorn9 小时前
设计模式是语言缺陷的补丁 —— 从工厂、单例、策略三个模式说起
设计模式
Lost of 程序猿9 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
一只旭宝9 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
YYYing.11 小时前
【设计模式系列 (四) 】建造者模式
c++·后端·设计模式·建造者模式·c/c++
Zane19941 天前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式