案例:看一个项目需求 咖啡馆订单系统项目(咖啡馆): 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合。
- Drink 是一个抽象类,表示饮料
- description就是描述,比如咖啡的名字等
- cost就是计算费用,是一个抽象方法
- Decaf 等等就是具体的单品咖啡,继承Drink,并实现cost方法
- Espresso&&Milk 等等就是单品咖啡+各种调料的组合,这个会很多..
- 这种设计方式时,会有很多的类,并且当增加一个新的单品咖啡或者调料时,类的数量就会倍增(类爆炸)
方案2可以控制类的数量,不至于造成过多的类。 在增删调料种类时,代码维护量仍然很大。 考虑到添加多份调料时,可以将Boolean 改成 Int
装饰者模式就像打包一个快递 主体:比如:陶瓷、衣服 (Component) 包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator) Component 主体:比如类似前面的Drink ConcreteComponent和Decorator ConcreteComponent:具体的主体, 比如前面的各个单品咖啡 Decorator: 装饰者,比如各调料. 在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。
装饰者模式定义
装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 这里提到的动态的将新功能附加到对象和ocp原则
装饰器的作用,类似于这样,就是继承了一个类已有,又实现了一个类的回调,然后无限装饰,每次新创建一个类,都可以把这个传入新类里面然后返回。