装饰模式
2020-09-21
定义 #
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。
理解 #
- java中的各种包装流就是用的装饰模式。
- 使用组合代替了不好的继承,使类的数量大大大的减少。
- 解决主体类在多个方向上的扩展功能。
案例 #
有一个类叫OutputStream,其完成一个打印的功能。
现在A想对该类进行扩充,使其有缓冲的功能。
B也想对该类进行扩充,使其输出更加安全。
C也想对该类进行扩充,使其输出到文件中。
这我们都可以通过类继承来完成,并且看上去似乎也没有什么问题。但是假如D也想对该类进行缓冲,使其既有缓冲,又更安全,这时候再使用类继承就不合适了。
此时我们可以使用装饰模式来解决该问题。
interface OutputStream{
public void print();
}
class ConcreteOutputStream implements OutputStream{
public void print(){}
}
//装饰器
abstract class Decorator implements OutputStream{
protected OutputStream outputStream;
public Decorator(OutputStream outputStream){
this.outputStream=outputStream;
}
public void print(){
outputStream.print();
}
}
//缓冲
class BufferedOutputStream extends Decorator{
public BufferedOutputStream(OutputStream outputStream){
super(outputStream);
}
public void print(){
System.out.println("I am BufferedOutputStream");
super.print();
}
}
//安全
class SecureOutputStream extends Decorator{
public SecureOutputStream(OutputStream outputStream){
super(outputStream);
}
public void print(){
System.out.println("I am SecureOutputStream");
super.print();
}
}
//输出到文件
class FileOutputStream extends Decorator{
public FileOutputStream(OutputStream outputStream){
super(outputStream);
}
public void print(){
System.out.println("I am FileOutputStream");
super.print();
}
}