设计模式入门-装饰器模式(php版)

来源:互联网 发布:php找工作 编辑:程序博客网 时间:2024/05/18 02:58

场景:一个朋友开了家咖啡店,供应了各种类型的咖啡,最初系统的设计如下uml类图所示:


Change:咖啡里面可以加很多调料,比如冰、糖、牛奶等,这些调料需要额外收费,按照之前的设计,我们如果想要得到每种咖啡的费用,我们就得新建六个类来实现,对应的类图如下:


Problem:试想调料有n种,咖啡有m种,难道我们要设计m*n个类来实现要求吗?

解决方案:

一、             不为每种调料设计一个新类,而是将其作为咖啡类的一个属性存在,最后根据咖啡是否具有该属性来计算价钱,具体类图如下:


这种方法看上去完美解决了需要创建多个类的弊端,但是没有解决一下问题:

1、  如果我想要双份牛奶咖啡,这种方式明显不能计算出应有的价钱

2、  违背了设计思想中“对扩展开放,对修改关闭的原则”

二、将调料独立出来,当做咖啡的“装饰物”,具体uml类图如下所示:


装饰器模式的官方解释是:动态的将责任附加到对象上,想要扩张功能,装饰着提供有别于继承的另一种选择。

这个设计模式给我们怎样的启发呢?那就是设计原则之一:对扩展开放,对修改关闭。

源码下载:http://www.walk-sing.com/decorate装饰器模式.zip

原文链接:http://www.walk-sing.com/?p=289

0 0
原创粉丝点击