3. 包装模式
2021-03-02 本文已影响0人
bit_拳倾天下
什么是包装模式?
动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的方案。
描述的有点抽象,打个比方:
食品场推出一种原味薯片包装1,有人想吃原味薯片,可以直接买走。但是有人反映,既想吃原味又想吃香辣的。直接把原来的薯片包装撕开,把香辣调料放进去肯定不好,于是食品场推出新的包装2,里边装着原来的原味薯片包装,又额外的增加了香辣调料包。但是又有人反映,同时想吃原味、香辣和孜然口味的,于是又推出了包装3,里边装着包装2,同时又加入了孜然调料包,这样就能满足新的需求了!
可以总结出以下几点:
- 三种包装都是薯片;
- 新包装在旧包装的基础上加了新的调料;
- 新包装还可以反复再套包装,例如:有小孩子既想吃两种味道的薯片,又想有小卡片可以玩,就可以在新包装外边再套一层,并加上卡片。
- 可以在包装时临时决定调料和包装,例如包装3:可以如图包装,也可以用包装1+香辣调料包+孜然调料包
包装模式就是这样,当一个类不能满足需求时,可以用一个包装类来对它进行包装以满足新的需求。前提是包装类和被包装类需要有相同的超类(就像例子中,新包装和旧包装都是薯片),这样就可以一层层的反复套包装。包装者内维护一个超类的实例对象,这样就可以在运行时给这个对象赋值一个被包装者对象(被包装者也是超类的子类),于是可以在被包装者的方法和属性基础上做一些改变从而满足新的需求。
抽象为对象模型: 对象模型关键步骤可以总结为:
- 包装类继承或实现和被包装类相同的超类(Chip)
- 定义一个超类的实例对象(Chip chip;)
- 给超类的示例对象赋值为被包装类对象(例子中用的是构造方法赋值,也可以用setter)
之后就可以根据需求为所欲为了!
优点:
- 可以在运行时动态的加上新的行为
- 可以在被包装者的方法前后做操作,甚至直接替换
- 可以不断的套包装
缺点:
- 导致设计中会出现许多小对象,不宜过度使用此模式
- 由于包装者内的被包装者使用超类声明的,所以如果有操作依赖与特定的被包装类,则会出现类型转换的问题
典型应用:
java I/O 中大量的使用包装模式,如:
FileInputStream fileInputStream = new FileInputStream("/test");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
他们都是 InputStream 的实现类,在本例中,fileInputStream 就是被包装者,bufferedInputStream 就是包装者。