装饰模式:Decorator
动态地将责任附加到对象上。想要扩展功能,装饰者提供有别与继承的另一种选择。
代码中经常看到根据条件判断来进行附加操作的很多if...else...操作;比如:去咖啡店;
咖啡店的咖啡品类有好多种,比如:深培DarkRoast、低糖Decaf、混合HouseBlend...,各种品类的咖啡售价都不同,那么设计类的时候,最先想到的就是设计一个抽象的咖啡超类里面有抽象方法cost,各种品类的咖啡继承超类,重写cost方法,来实现各自的价格;(这么设计看似没问题)
后续随着新产品的调整,咖啡店开始增加不同口味辅料,比如:奶泡Whip、摩卡Mocha、豆浆Soy...,面对这样的调整,简单的做法就是在之前的类中添加上条件,针对不同的辅料添加不同的条件
比如:
if (Mocha) {
cost + 0.6;
}else if (Whip){
cost + 0.7;
}
这么设计能实现功能,但是将会面临很多的问题,比如要新增新的口味,必须修改类;删除口味也需要修改类,会给后续的维护带来很大的困扰;
以装饰者构造咖啡订单
咖啡组件 装饰类 具体调用1、以DarkRoast对象开始
2、顾客想要摩卡Mocha,所以建立一个Mocha对象,并用它将DarkRoast对象包装起来
3、顾客也想要奶泡Whip,所以需要建立一个Whip装饰者,并用它将Mocha对象包起来。
4、现在该为顾客算钱啦,通过调用最外圈装饰者Whip的cost。Whip会先委托它装饰的对象(也就是Mocha)计算出价钱,Mocha会先委托它装饰的DarkRoast对象计算出价格在加上Mocha的价格交给装饰对象Whip,最后Whip对象使用返回的价格再加上自己的价格即可
装饰者模式装饰者类图总结如上;
到目前所能知道关于装饰模式的一切
1、装饰者和被装饰者对象有相同的超类型
2、可以用一个或者多个装饰者包装一个对象
3、既然装饰者和被装饰者对象有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它
4、对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用喜欢的装饰者装饰对象
要点:
装饰者模式意味着一群装饰者类,这些类用来包装具体组件
装饰者类反映出被装饰的组件类型(事实上他们具有相同的类型,都经过接口或继承实现)
装饰者可以在被装饰者的行为前面或后面添加上自己的行为,甚至将被装饰者的行为整个替换掉,而达到特定的目的
装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂
装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
总结:
OO基础:
封装、继承、多态、抽象
OO原则:
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合设计而努力
对扩展开放,对修改关闭 --- 开闭原则
网友评论