设计模式之一装饰模式(含源码):以售卖咖啡,配料应用解读

以售卖咖啡,在咖啡中添加不同的配料为例,体验装饰模式的好处:

  • 装饰模式介绍
  • 应用背景
  • UML设计
  • 总结

装饰模式介绍

以生活中场景为例,在穿搭衣服时,不同的服饰和不同的顺序会产生不一样的结果。常规的穿法是先穿内裤再穿裤子,这是正常人的装扮。而也可以先传裤子,再穿内裤,这是超人的装扮。不同的顺序决定了最后装扮不同。而对于女生,沙滩裙和凉鞋是度假的装扮,衬衫裙和通勤鞋是上班的装扮。不同的服饰也决定了不同的装扮。
装扮的服饰是不固定的,顺序也不固定。怎样针对具体的情况封装不同的装扮呢?
这就是装饰模式的好处了,对于穿搭过程,内部构造不稳定的情况,使用装饰者模式。
设计模式之一装饰模式(含源码):以售卖咖啡,配料应用解读_第1张图片

两个重点:
SetCompont: 通过引用的方式,将上一层包装的对象传递到本层中,完成包装
重载装饰方法:调用本层的装饰函数,完成本层独有的装饰功能

应用背景

根据售卖咖啡的过程,客户先选择一种口味的咖啡,又选择不同种类的配料,由于配料选择是不定的,符合装饰模式的应用情况。
设计模式之一装饰模式(含源码):以售卖咖啡,配料应用解读_第2张图片

UML设计

设计模式之一装饰模式(含源码):以售卖咖啡,配料应用解读_第3张图片
SellCoffee是父类,Coffee类和Ingredient类是过程的子类。可视为使用Ingredient类装饰Coffee类。装饰函数为Add(),最后获得totalprice即可。
Coffee类和Ingredient类的名称和价格使用枚举的方式赋值。

代码下载:https://download.csdn.net/download/vainfanfan/10513112

总结

装饰模式顾名思义,只是对装饰功能的一种封装。最大的好处是为程序动态的添加一种新的功能。动态即未必是所有情况都可以用到。这样就把程序的核心功能和装饰功能分开。
如果程序在之后的过程中需要有选择,按顺序的添加一种新的功能,就可以使用装饰模式。

思考

有这样一个问题:既然对于配料来说,所有的配料起到的装饰作用是一样的,那么就没有必要在Ingredient下衍生多个子类了。

你可能感兴趣的:(详解设计模式)