设计模式系列 装饰模式
2012-05-19 14:26
197 查看
本文属于设计模式的必读书籍《Head First Design Patterns》的读书笔记,有不正确的地方欢迎指正。
首先,看看GoF对装饰模式的定义:
意图:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
定义很抽象,让我们来看看一个具体的业务场景:
在城市的某个中央商务区,一个小小的咖啡馆,生意兴隆,在收银台常常排的长长的队伍,顾客也多有抱怨。老板了解到客户的需求之后,发现如果有个如超市的收银机会很大的提高收款的效率,于是找到某家IT公司,请求开发一套收银系统。
需求:咖啡馆烤4种咖啡,然后,顾客可以在咖啡中添加巧克力,牛奶,摩卡等辅料。出售价格是按照咖啡的种类和添加的辅料计算。
首先,反应到大脑中的类图如下:
马上,你可能会意识到这个结构式有问题的,也就是如果有新的辅料加入进来,就需要修改父类,明显的违背了“开-闭”的设计原则。
那么,这个设计的问题出在哪里呢?答案就是对象的所有行为都是在编译器被定义下来了,无法再运行期动态的修改,导致如果有新的元素加入,导致必须要修改类。这里需要一种对象可以在运行期间动态的加入的行为的功能。我们再来看看装饰模式的定义:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
下面看看GoF给出的关于装饰模式的类图
设计完成后的收银系统类图如下:
首先,看看GoF对装饰模式的定义:
意图:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
定义很抽象,让我们来看看一个具体的业务场景:
在城市的某个中央商务区,一个小小的咖啡馆,生意兴隆,在收银台常常排的长长的队伍,顾客也多有抱怨。老板了解到客户的需求之后,发现如果有个如超市的收银机会很大的提高收款的效率,于是找到某家IT公司,请求开发一套收银系统。
需求:咖啡馆烤4种咖啡,然后,顾客可以在咖啡中添加巧克力,牛奶,摩卡等辅料。出售价格是按照咖啡的种类和添加的辅料计算。
首先,反应到大脑中的类图如下:
马上,你可能会意识到这个结构式有问题的,也就是如果有新的辅料加入进来,就需要修改父类,明显的违背了“开-闭”的设计原则。
那么,这个设计的问题出在哪里呢?答案就是对象的所有行为都是在编译器被定义下来了,无法再运行期动态的修改,导致如果有新的元素加入,导致必须要修改类。这里需要一种对象可以在运行期间动态的加入的行为的功能。我们再来看看装饰模式的定义:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。
下面看看GoF给出的关于装饰模式的类图
设计完成后的收银系统类图如下:
相关文章推荐
- 装饰模式----设计模式系列
- 装饰模式 -- 设计模式系列文章(三)
- 设计模式系列-----------装饰器模式(Decorator)
- 通俗易懂系列 | 设计模式(二):装饰模式
- iOS 设计模式系列:Decorator – 装饰器模式
- PHP设计模式系列(二):装饰模式
- 设计模式学习系列七:装饰模式(Decorator)
- 设计模式系列(四)——装饰模式
- 从FLC中学习的设计模式系列-结构型模式(2)-装饰
- 设计模式系列-装饰模式
- 炒冷饭系列:设计模式 装饰模式
- 炒冷饭系列:设计模式 装饰模式
- 设计模式系列 - 装饰模式
- PHP设计模式系列 - 装饰器
- 研磨设计模式 之 装饰模式(Decorator)2??跟着cc学设计系列
- 设计模式系列-装饰模式
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
- 设计模式系列-装饰模式
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
- 设计模式系列-装饰模式