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

文章目录


前言

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


一、介绍

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

二、详细分析

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

相关推荐
小林up11 小时前
【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态
c语言·设计模式
大耳朵土土垚15 小时前
【Linux】日志设计模式与实现
linux·运维·设计模式
小王子102418 小时前
设计模式Python版 组合模式
python·设计模式·组合模式
linwq820 小时前
设计模式学习(二)
java·学习·设计模式
小王子10242 天前
设计模式Python版 桥接模式
python·设计模式·桥接模式
Cikiss2 天前
「全网最细 + 实战源码案例」设计模式——桥接模式
java·后端·设计模式·桥接模式
纪元A梦2 天前
Java设计模式:行为型模式→观察者模式
java·观察者模式·设计模式
荣--2 天前
DAB实现中用到的主要设计模式
设计模式·dab
mofei121383 天前
Python设计模式 - 组合模式
python·设计模式·组合模式
小王子10243 天前
设计模式Python版 抽象工厂模式
python·设计模式·抽象工厂模式