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

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


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



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


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


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




另外我当时想装饰者的时候,是在被装饰者类里面加入一个装饰者链表,这样也可以达到差不多相同的目的







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值