您的位置:首页 > 财经 > 产业 > 深度学习设计模式之装饰器模式

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

2024/12/23 6:16:52 来源:https://blog.csdn.net/G_whang/article/details/139308953  浏览:    关键词:深度学习设计模式之装饰器模式

文章目录

  • 前言
  • 一、介绍
  • 二、详细分析
    • 1.核心组成
    • 2.实现步骤
    • 3.代码示例
    • 4.优缺点
      • 优点
      • 缺点
    • 5.使用场景
  • 总结


前言

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


一、介绍

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

二、详细分析

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 = "台式机";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 5000;}
}
/*** 被装饰者*/
public class LaptopComputer implements Computer {private String desc = "笔记本电脑";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 6000;}
}

装饰者

/*** 装饰者*/
public class ComputerDecorator implements Computer {private String desc = "";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 0;}
}

具体装饰物

/*** 具体装饰者*/
public class RAMComputerDecorator extends ComputerDecorator{private Computer computer;public RAMComputerDecorator(Computer computer) {this.computer = computer;}private String desc = "增加16G内存";@Overridepublic String getDesc() {return computer.getDesc()+","+desc;}@Overridepublic 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;}@Overridepublic String getDesc() {return computer.getDesc()+","+desc;}@Overridepublic 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类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com