装饰模式

装饰模式

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();
    }
}