设计模式之——装饰者模式(Decorator)
2011-11-21 11:16
363 查看
装饰者模式又是一个用组合代替继承很好的例子。我们考虑一下一个情景:一个咖啡店要卖各种饮料,如果我们用继承的模式,那么肯定先设计一个饮料的基类,然后把其他的这种特殊饮料从基类继承,那么类图关系如下
如果仅仅有这么几种饮料当然没有问题,但客户的需求是多样的,有的人要加糖的,有的人要两份咖啡的,有的人要大杯的,有的人要小杯的,那么如果为每一种组合都生产一个类的话,那么就会像下图这样
这会令人完全崩溃的,这个时候就该装饰者出场了,它也会需要一个饮料的基类,但不会把每种组合的饮料都作为子类,而是仅仅把主饮料作为子类,在我们这个例子里面是各种咖啡,如深烘焙咖啡(darkroast),无咖啡因(decaf)等,而将糖,牛奶等作为配料,即装饰者,其类图如下
PS:这里有一个地方值得注意的,就是我们的装饰者类也是继承自饮料类,那么和我们之前说的不用继承用组合的说法是矛盾的,其实这里的仅仅是继承了饮料类的接口,而不用它的行为(所以所有的装饰类都要重写继承来的接口函数),这样做的好处是可以让被装饰者和装饰者有同样的类型和接口,从而实现面向接口编程。而对于装饰者来说,它包含了一个指向饮料类的指针,这才是它的意义所在。
那么这样我们就可以随意组合,并最终得到描述和价格,如
另外我当时想装饰者的时候,是在被装饰者类里面加入一个装饰者链表,这样也可以达到差不多相同的目的
如果仅仅有这么几种饮料当然没有问题,但客户的需求是多样的,有的人要加糖的,有的人要两份咖啡的,有的人要大杯的,有的人要小杯的,那么如果为每一种组合都生产一个类的话,那么就会像下图这样
这会令人完全崩溃的,这个时候就该装饰者出场了,它也会需要一个饮料的基类,但不会把每种组合的饮料都作为子类,而是仅仅把主饮料作为子类,在我们这个例子里面是各种咖啡,如深烘焙咖啡(darkroast),无咖啡因(decaf)等,而将糖,牛奶等作为配料,即装饰者,其类图如下
PS:这里有一个地方值得注意的,就是我们的装饰者类也是继承自饮料类,那么和我们之前说的不用继承用组合的说法是矛盾的,其实这里的仅仅是继承了饮料类的接口,而不用它的行为(所以所有的装饰类都要重写继承来的接口函数),这样做的好处是可以让被装饰者和装饰者有同样的类型和接口,从而实现面向接口编程。而对于装饰者来说,它包含了一个指向饮料类的指针,这才是它的意义所在。
那么这样我们就可以随意组合,并最终得到描述和价格,如
另外我当时想装饰者的时候,是在被装饰者类里面加入一个装饰者链表,这样也可以达到差不多相同的目的
相关文章推荐
- 设计模式之装饰者模式(Decorator)
- C#设计模式(9)——装饰者模式(Decorator Pattern)
- c++设计模式:装饰者模式(Decorator Pattern)
- 设计模式学习之装饰者模式(Decorator,结构型模式)(16)
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
- Java设计模式-装饰者模式(Decorator)
- (C++)设计模式------装饰者模式 decorator
- 如何让孩子爱上设计模式 ——8.装饰者模式(Decorator Pattern)
- C#设计模式——装饰者模式(Decorator Pattern)
- 设计模式-装饰者模式(Decorator)
- java设计模式学习(三)装饰者模式(decorator)
- 设计模式与泡mm的关系之Decorator装饰者设计模式及装饰者设计模式的再思考
- C++设计模式之装饰者模式(Decorator)
- Java设计模式之 —— 装饰者(Decorator) — 点炒饭
- [设计模式] 9 装饰者模式 Decorator
- 设计模式之【装饰者--Decorator】
- 设计模式学习3——装饰者模式(Decorator)
- c++设计模式:装饰者模式(Decorator Pattern)
- 【设计模式】HeadFirst设计模式(三):装饰者(Decorator)模式
- 浅学设计模式之装饰者<Decorator>模式 .