文章目录
- 前言
- 一、介绍
- 二、详细分析
- 1.核心组成
- 2.实现步骤
- 3.代码示例
- 4.优缺点
- 优点
- 缺点
- 5.使用场景
- 总结
前言
装饰器模式属于结构型模式,又叫包装设计模式,动态的将责任添加到对象上。
一、介绍
装饰器模式又叫包装设计模式,为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种方式 继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承更加灵活。
二、详细分析
1.核心组成
- 抽象组件(Component):定义装饰⽅方法的规范;
- 被装饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象;
- 装饰者组件(Decorator):定义具体装饰者的行为规范, 和Component角色有相同的接口,持有组件(Component)对象的实例例引用;
- 具体装饰物(ConcreteDecorator):负责给构件对象装饰附加的功能。
2.实现步骤
- 创建抽象组件,定义公用的方法;
- 创建被抽象者,实现抽象组件接口,实现基础方法;
- 创建装饰者,实现抽象组件接口,可不做实现;
- 创建具体抽象者,继承装饰者类,实现具体方法,添加抽象组件属性。
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类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。