readme
装饰器模式:
总:心中一定要有图
e.g.<br /> 星巴克咖啡订单项目(咖啡馆)<br /> (1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)<br /> (2) 调料:Milk、Soy(豆浆)、Chocolate<br /> 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便。<br /> 使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。方案一:<br /> 1)编写一个饮料的顶层父类,定义一个计算费用的通用方法<br /> 2)每当有一种咖啡组合就去继承父类<br /> 3)这样的问题会导致类爆炸<br /> 方案二:<br /> 1)编写一个饮料的顶层父类<br /> 2)编写所有调料类,将调料聚合到父类中<br /> 3)在父类中编写添加不同调料的所有方法<br /> 4)编写coffee类继承父类即可,想用什么方法就用什么<br /> 5)解决排列组合造成的类爆炸问题,==》新问题就是产生新调料类或删除,代码维护成本高<br /> 6)引出装饰者模式<br /> 装饰者模式:<br /> 1)动态的新功能附加到对象上,比继承更有弹性,符合ocp原则<br /> 2)coding:<br /> (1)定义顶层饮料抽象类(有些方法是主体者装饰者都可以使用的方法和属性【咖啡主体,调料是装饰者】)<br /> (2)咖啡父类继承订料抽象类<br /> (3)具体咖啡品牌继承咖啡父类<br /> (4)编写装饰者父类(将咖啡父类或顶层抽象类继承并聚合到其中【多态,继承】)<br /> (5)编写具体的装饰者(调料去继承装饰者父类,通过构造方法组合咖啡类【通过多态完成】)<br /> 【装饰者中就有了主体,通过传参的方式可以起到装饰主体的效果】<br /> 3)注意和细节:<br /> (1)分别抽象出主体和装饰者<br /> (2)通过多态,将主体的顶层父类组合到装饰者中,将客户端有主体时,可以通过传参的方式<br /> 将主体和不同的装饰者混合在一起,达到如名意思一样的装饰效果<br /> (3)装饰者抽象类,需要继承和聚合主体,才能达到装饰的效果
装饰者类图
装饰者模式代码
Chocolate.javaClient.javaCoffee.javaDecorator.javaDrink.javaEspresso.java
