深度学习设计模式之装饰器模式

文章目录


前言

装饰器模式属于结构型模式,又叫包装设计模式,动态的将责任添加到对象上。


一、介绍

装饰器模式又叫包装设计模式,为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种方式 继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承更加灵活。

二、详细分析

1.核心组成

  • 抽象组件(Component):定义装饰⽅方法的规范;
  • 被装饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象;
  • 装饰者组件(Decorator):定义具体装饰者的行为规范, 和Component角色有相同的接口,持有组件(Component)对象的实例例引用;
  • 具体装饰物(ConcreteDecorator):负责给构件对象装饰附加的功能。

2.实现步骤

  1. 创建抽象组件,定义公用的方法;
  2. 创建被抽象者,实现抽象组件接口,实现基础方法;
  3. 创建装饰者,实现抽象组件接口,可不做实现;
  4. 创建具体抽象者,继承装饰者类,实现具体方法,添加抽象组件属性。

3.代码示例

抽象组件

复制代码
/**
 * 抽象组件
 */
public interface Computer {

    /**
     * 描述
     */
    String getDesc();

    /**
     * 价格
     * @return
     */
    int getPrice();

}

被装饰者

复制代码
/**
 * 被装饰者
 */
public class DesktopComputer implements Computer {

    private String desc = "台式机";

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 5000;
    }
}

/**
 * 被装饰者
 */
public class LaptopComputer implements Computer {

    private String desc = "笔记本电脑";
    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 6000;
    }
}

装饰者

复制代码
/**
 * 装饰者
 */
public class ComputerDecorator implements Computer {

    private String desc = "";

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 0;
    }
}

具体装饰物

复制代码
/**
 * 具体装饰者
 */
public class RAMComputerDecorator extends ComputerDecorator{

    private Computer computer;

    public RAMComputerDecorator(Computer computer) {
        this.computer = computer;
    }

    private String desc = "增加16G内存";

    @Override
    public String getDesc() {
        return computer.getDesc()+","+desc;
    }

    @Override
    public int getPrice() {
        return computer.getPrice() + 500;
    }
}

/**
 * 具体装饰物
 */
public class SSDComputerDecorator extends ComputerDecorator{

    private Computer computer;

    private String desc = "增加1T的固态硬盘";

    public SSDComputerDecorator(Computer computer) {
        this.computer = computer;
    }

    @Override
    public String getDesc() {
        return computer.getDesc()+","+desc;
    }

    @Override
    public int getPrice() {
        return computer.getPrice()+1000;
    }
}

测试类

复制代码
 public static void main(String[] args) {
        Computer computer = new DesktopComputer();
        // 增加硬盘
        computer = new SSDComputerDecorator(computer);
        // 增加内存
        computer = new RAMComputerDecorator(computer);

        System.out.println(computer.getDesc()+",价格为:"+computer.getPrice());

    }

结果:

4.优缺点

优点

  • 可以在运行时动态地给一个对象添加额外的职责。
  • 装饰类会继承原始类的所有接口和实现,因此对于客户端来说,装饰对象和原始对象可以无缝替换。
  • 当需要修改现有功能或添加新功能时,可以通过添加新的装饰类来实现,而不需要修改原有的代码。

缺点

  • 每增加一个装饰器,系统中就多了一个类,这可能会使系统变得更加复杂。
  • 随着装饰器数量的增加,管理这些装饰器可能会变得困难。

5.使用场景

  • 当需要动态地给对象添加额外功能时,装饰器模式可以在运行时通过组合的方式来增强对象的功能,而不需要通过继承来静态扩展。
  • 当通过继承来扩展功能导致类的数量急剧增加,形成复杂的继承体系时,装饰器模式可以作为一种替代方案来简化设计。

总结

以上就是今天要讲的内容,本文简单介绍了装饰器模式的优缺点和使用场景,提供了代码示例。装饰器模式也在Java IO类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。

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