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


前言

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


一、介绍

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

二、详细分析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值