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

文章目录


前言

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


一、介绍

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

二、详细分析

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类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。

相关推荐
8***29311 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你10 小时前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing15 小时前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白15 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科15 小时前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记16 小时前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
ada0_ada116 小时前
行为型模式:②命令模式(Command Pattern)
设计模式
o0向阳而生0o17 小时前
113、23种设计模式之中介者模式(21/23)
设计模式·中介者模式
心语星光17 小时前
23种经典设计模式
设计模式
ACE19852 天前
AI Agent 设计模式深度解析:提示链(Prompt Chaining)模式
人工智能·设计模式·prompt