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

概述

装饰器模式 : 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();

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

    }
}
复制代码
运行结果:
生产电脑。。。
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响
相关推荐
J_liaty1 天前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇1 天前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日1 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.1 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon1 天前
七大设计原则介绍
设计模式
YigAin1 天前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业2 天前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑2 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲2 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头2 天前
设计模式与C语言高级特性的结合
c语言·设计模式