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

概述

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

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

    }
}
运行结果:
生产电脑。。。
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响
相关推荐
java技术小馆5 小时前
责任链模式如何减少模块之间的耦合
java·数据库·设计模式·责任链模式
seven97_top7 小时前
【设计模式】通过访问者模式实现分离算法与对象结构
设计模式·访问者模式
seven97_top7 小时前
【设计模式】从事件驱动到即时更新:掌握观察者模式的核心技巧
java·观察者模式·设计模式
workflower7 小时前
什么是设计模式
java·开发语言·设计模式·软件工程·需求分析·软件需求
牵牛老人7 小时前
C++设计模式-原型模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·原型模式
xiaolingting7 小时前
设计模式在 JDK 中的具体应用与分析
java·单例模式·设计模式·代理模式·享元模式·中介模式·jdk设计模式应用
Microsoft Word8 小时前
代码块与设计模式
java·算法·设计模式
wenbin_java8 小时前
设计模式之适配器模式:原理、实现与应用
java·设计模式·适配器模式
码农的天塌了8 小时前
java设计模式之适配器模式
java·设计模式·适配器模式
JuicyActiveGilbert8 小时前
【C++设计模式】第二十三篇:观察者模式(Observer)
c++·观察者模式·设计模式