装饰器模式
1.概述
装饰器模式 (Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构
,这种类型的设计模式属于结构型设计模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
- 以动态、透明的⽅式给单个对象添加职责,但
⼜能不改变其结构
- JDK源码⾥⾯应⽤的最多的就是IO流,⼤量使⽤装饰设 计模式
2.代码实现
2.1抽象组件
public interface Phone {
void call();
}
2.2被装饰者
实现Phone接口的两个实现类
实现类HuaWei
public class HuaWei implements Phone {
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
实现类Xiaomi
public class XiaoMi implements Phone {
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
2.3装饰者组件
public class PhoneDecorator implements Phone {
//传入被装饰着
private Phone phone;
//构造器内赋值
public PhoneDecorator(Phone phone) {
this.phone = phone;
}
//调用传入的call方法
@Override
public void call() {
phone.call();
}
}
2.4具体装饰
public class VideoPhoneDecorator extends PhoneDecorator {
//装饰一个增加视频通话的功能。
public void addVideo() {
System.out.println("增加视频通话功能");
}
public VideoPhoneDecorator(Phone phone) {
super(phone);
}
@Override
public void call() {
super.call();
//添加一个额外功能。
addVideo();
}
}
2.5测试
public class Main {
public static void main(String[] args) {
Phone huawei = new VideoPhoneDecorator(new HuaWei());
Phone xiaoMi = new VideoPhoneDecorator(new XiaoMi());
huawei.call();
System.out.println("----------");
xiaoMi.call();
}
}
/*
华为手机打电话
增加视频通话功能
----------
小米手机打电话
增加视频通话功能
*/
3.总结
- 装饰模式与继承关系的⽬的都是要扩展对象的功能,
但装饰模式可以提供⽐继承更多的灵活性
- 使⽤不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同⾏为的组合,原有代码⽆须改变,符合 “开闭原则”
- 实现起来比较简单,但是应用相对较多。
4.Java中IO流的装饰器模式
参考
-
抽象组件
(Component):InputStream -
被装饰者
(ConcreteComponent) : FileInputStream 、 ByteArrayInputStream
Component的具体实现,也就是我们要装饰的具体对象 -
装饰者组件
(Decorator):FilterInputStream
定义具体装饰者的⾏为规范, 和Component⻆⾊有相同 的接⼝,持有组件(Component)对象的 -
具体装饰物
(ConcreteDecorator):BufferedInputStream、 DataInputStream