装饰器模式
2021-04-14 本文已影响0人
lj72808up
装饰器模式
-
思想: 组合优于继承
-
JDK 的 IO 流就是使用包装模式对流进行各种增强
如下代码, 用 BufferedInputStream 增强 FileInputStream 的读取功能.- 装饰类: BufferedInputStream
- 原始类: FileInputStream
- 装饰类和原始的共同父类: InputStream
new BufferedInputStream(new FileInputStream())
-
为什么装饰类和原始类要继承同一个父类?
- 因为装饰类和原始类都是对父类某种功能的扩充, 所以要继承同一个父类.比如:
BufferedInputStream
从读取到 buffer
的角度增强;FileInputStream
是从文件来源的角度增强 - 装饰类又要对原始类做扩充, 所以拥有一个原始类属性. 从而实现类的组合. 比如: 从
BufferedInputStream
的构造函数就可以看出
- 因为装饰类和原始类都是对父类某种功能的扩充, 所以要继承同一个父类.比如:
-
代理模式和装饰其模式都是为了增强类的功能, 他们的区别是什么?
- 代理模式中,代理类附加的是跟原始类无关的功能,
- 装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。
设计模式往往是出发点的不同, 写法上往往很类似.(除了继承, 就是实现接口, 属性注入进行累的组合等) 比如下面的代理模式和装饰器模式, 如果让装饰类改为实现接口, 则代码和代理模式一模一样.
// 代理模式的代码结构(下面的接口也可以替换成抽象类)
public interface IA {
void f();
}
public class A impelements IA {
public void f() { //... }
}
public class AProxy implements IA {
private IA a;
public AProxy(IA a) {
this.a = a;
}
public void f() {
// 新添加的代理逻辑
a.f();
// 新添加的代理逻辑
}
}
// 装饰器模式的代码结构(下面的接口也可以替换成抽象类)
public interface IA {
void f();
}
public class A implements IA {
public void f() { //... }
}
public class ADecorator implements IA {
private IA a;
public ADecorator(IA a) {
this.a = a;
}
public void f() {
// 功能增强代码
a.f();
// 功能增强代码
}
}