您的位置:首页 > 其它

设计模式之——装饰者模式(Decorator)

2011-11-21 11:16 363 查看
装饰者模式又是一个用组合代替继承很好的例子。我们考虑一下一个情景:一个咖啡店要卖各种饮料,如果我们用继承的模式,那么肯定先设计一个饮料的基类,然后把其他的这种特殊饮料从基类继承,那么类图关系如下



如果仅仅有这么几种饮料当然没有问题,但客户的需求是多样的,有的人要加糖的,有的人要两份咖啡的,有的人要大杯的,有的人要小杯的,那么如果为每一种组合都生产一个类的话,那么就会像下图这样



这会令人完全崩溃的,这个时候就该装饰者出场了,它也会需要一个饮料的基类,但不会把每种组合的饮料都作为子类,而是仅仅把主饮料作为子类,在我们这个例子里面是各种咖啡,如深烘焙咖啡(darkroast),无咖啡因(decaf)等,而将糖,牛奶等作为配料,即装饰者,其类图如下





PS:这里有一个地方值得注意的,就是我们的装饰者类也是继承自饮料类,那么和我们之前说的不用继承用组合的说法是矛盾的,其实这里的仅仅是继承了饮料类的接口,而不用它的行为(所以所有的装饰类都要重写继承来的接口函数),这样做的好处是可以让被装饰者和装饰者有同样的类型和接口,从而实现面向接口编程。而对于装饰者来说,它包含了一个指向饮料类的指针,这才是它的意义所在。

那么这样我们就可以随意组合,并最终得到描述和价格,如



另外我当时想装饰者的时候,是在被装饰者类里面加入一个装饰者链表,这样也可以达到差不多相同的目的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: