装饰模式--《HeadFirst设计模式》

2021-03-17  本文已影响0人  吕建雄

装饰模式: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原则:

封装变化

多用组合,少用继承

针对接口编程,不针对实现编程

为交互对象之间的松耦合设计而努力

对扩展开放,对修改关闭 --- 开闭原则

装饰模式具体实现代码

上一篇 下一篇

猜你喜欢

热点阅读