装饰器模式
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 










