文章目录
- 前言
- 一、介绍
- 二、详细分析
- 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 = "台式机";
@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类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。