当前位置: 首页 > news >正文

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

概述

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

核心思想

1、开放封闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
装饰器模式很好地体现了这一原则,它允许我们在不改变已有代码的情况下,通过添加新的装饰器类来扩展功能。
2、避免继承层次过多:如果使用继承来实现功能扩展,可能会导致子类数量爆炸式增长。而使用装饰器模式可以有效地减少这种复杂性。

主要角色

1、Component(组件):定义了被装饰的对象接口,可以是一个具体类或抽象类。
2、ConcreteComponent(具体组件):实现了Component接口的具体类,是我们希望装饰的对象。
3、Decorator(装饰器):持有一个Component对象的引用,并且定义了一个与Component相同的接口,使得Decorator可以替代具体的组件。
4、ConcreteDecorator(具体装饰器):实现了Decorator接口,并在其基础上添加了额外的行为或功能。

情景模式

1、有一些企业是 做电子产品的,可以生产各种各样的电子产品 - 抽象的组件
2、有一家企业是 专门生产电脑的 - 具体的组件
3、有一些企业是做 音响的,可以给电脑配置音响 - 装饰器
4、有一家企业是 专门给电脑定制音响的 - 具体装饰器
5、有一些企业是做 软件的,可以给电脑安装软件 - 装饰器
6、有一家企业是 专门给电脑做 聊天软件的 - 具体的装饰器

类图

在这里插入图片描述

案例代码

被装饰者-组件

接口类

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

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

    }
}

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

相关文章:

  • 信奥赛CSP-J复赛集训(模拟算法专题)(10):P2356 弹珠游戏
  • Linux:Ubuntu server 24.02 上搭建 ollama + dify
  • 【Golang】第三弹----运算符
  • 数据类设计_图片类设计之3_半规则图类设计(前端架构基础)
  • 【贪心算法4】
  • AI 变革药物研发:深势科技的云原生实践之路
  • 【每日学点HarmonyOS Next知识】tab拦截、组件方法做参数、自定义组件链式调用、多次观察者监听、横竖屏切换
  • C++20中的`std::endian`:深入理解大端/小端/本地字节序
  • wps word 正文部分段前段后间距调整无用
  • halcon机器人视觉(四)calibrate_hand_eye_stationary_3d_sensor
  • Pytorch系列教程:可视化Pytorch模型训练过程
  • 【WRF-Urban】报错解析:ZDC + Z0C + 2m is larger than the 1st WRF level
  • react实现一个列表的拖拽排序(react实现拖拽)
  • 如何在DBeaverSQL执行界面显示行号
  • 力扣hot100_二叉树
  • 【JavaWeb】快速入门——HTMLCSS
  • 机器人领域专业名词汇总
  • C++学习——顺序表(六)
  • 【探秘机器人:从当下到未来的科技跃迁】
  • 理解 Retrofit 请求头与 GsonConverterFactory 的自动处理机制
  • 百色一女子称家委会强制排班被迫抱婴儿校门口站岗?区教育局:自愿参与
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣
  • 鸿海下调全年营收展望:AI服务器业务强劲,预计今年营收增超50%
  • 十年磨一剑!上海科学家首次揭示宿主识别肠道菌群调控免疫新机制
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 上海市重大工程一季度开局良好,崇明线等按既定计划加快建设