目录

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

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

概述

装饰器模式
:
Decorator Pattern
是一种结构型设计模式.

作用 : 允许你 动态地给对象添加功能或职责 ,而 无需修改其原始类的代码 ,非常的符合 开闭原则

实现思路 :通过创建一个包装对象(即装饰器),来包裹原始对象,并在运行时动态地为这个对象增加新的行为。

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

核心思想

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

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

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

主要角色

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

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

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

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

情景模式

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

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

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

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

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

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

类图

https://i-blog.csdnimg.cn/direct/149efa02095b4e65b2b48712a2f5cfb2.png

案例代码

被装饰者-组件

接口类

public interface ElectronProduct {
    void generatElectronProduct();
}

具体实现类

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

装饰器

抽象类/基类

public abstract class ELectronicDecorator implements ElectronProduct{

    protected ElectronProduct electronProduct;

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

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

具体实现类-可以有多个

public class ComputerDecorator extends ELectronicDecorator{
    public ComputerDecorator(ElectronProduct electronProduct) {
        super(electronProduct);
    }

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

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

测试类


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();

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

    }
}
运行结果:
生产电脑。。。
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
 =============== 
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响