装饰者模式
咖啡案例引入
- 1.咖啡种类,有意大利咖啡(Espresso),ShortBlack,美式咖啡(LongBlack),无因咖啡(Decaf)。
- 2.调料,Milk,Soy(豆浆),Chocolate(巧克力)。
- 3.要求再扩展新的咖啡种类时,具有良好的扩展性,改动方便,维护方便。
- 4.客户可以点单品咖啡,也可以点单品 + 调料组合。
方案1类图

方案1类图分析
- 1.Drink是抽象类,表示饮料。
- 2.description是对咖啡的描述,如咖啡的名字。
- 3.cost()是计算费用,Drink类中定义为抽象的。
- 4.Decaf等就是单品咖啡,继承Drink,重写cost()。
- 5.Espresso && Milk就是单品咖啡 + 调料,这个组合很多。
- 6.这样设计,会有很多类,当我们增加一个单品咖啡,或者一个新的调料,类的数量就会暴增,会出现类爆炸。
方案2类图

类图分析
方案1会出现,咖啡单品 + 调料组合会造成类的倍增,因此可以做改进,将调料内置在Drink中,这样就不会出现类爆炸,提高项目的可维护性。说明milk,soy,chocolate可以设计为Boolean,表示是否要添加相应的调料。
- 1.方案2可以控制类数量,避免类爆炸情况。
- 2.但在增加和删除调料时,代码的维护量还是很大。
- 3.用户点多份调料的情况,可以返回一个int值,代表份数。
- 4.可以考虑使用装饰者模式。
基本介绍
- 1.装饰者模式(Decorator Pattern),动态的将新功能附加到对象上。在对象扩展方面,比继承更有弹性,装饰者模式也提醒了开闭原则(ocp)。
- 2.这里提到的动态附加新功能到对象上,和ocp,在案例中有体现。
装饰者原理举例
- 1.装饰者模式就像打包一个快递。主体是衣服,陶瓷等,包装,比如塑料,泡沫,木板等。这样构成一个完整的快递。
- 2.主体,就是Drink(被装饰者),包装就是Decorator(装饰者)。
装饰者模式实现案例类图

说明,类图中的Decorator应该是继承Drink,然后在Decorator中组合一个 Drink drink属性;
装饰者模式在JDK应用分析
 - import java.io.DataInputStream;
- import java.io.FileInputStream;
- /**
- * @author 长名06
- * @version 1.0
- */
- public class AnalysisDecoratorIO {
- public static void main(String[] args) throws Exception{
- //JDK源码中就使用到了装饰者模式
- //1.InputStream是抽象类,类似我们前面讲的Drink
- //2.FileInputStream是InputStream子类,类似我们前面的 DeCaf, LongBlack
- //3. FilterInputStream是InputStream子类:类似我们前面的Decorator修饰者
- //4. DataInputStream是 FilterInputStream子类,具体的修饰者,类似前面的Milk, Soy 等
- // 5.FilterInputStream类有 protected volatile InputStream in属性 ;即含被装饰者
- //6.分析得出在jdk 的io体系中,就是使用的装饰者模式
- DataInputStream dis = new DataInputStream(new FileInputStream("d:\\abc.txt"));
- }
- }
复制代码 只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |