设计模式之装饰者模式(一)

通过前两个模式的学习,是否是对设计模式有了进一步的认识了呢,如今,咱们继续冲鸭。git

本章能够称为“给爱用继承的人一个全新的设计眼界”。这里咱们即将再度探讨典型的继承滥用问题,咱们将学到如何使用对象组合的方式,作到在运行时装饰类。为何呢?一旦熟悉了装饰的技巧,你将可以在不修改任何底层代码的状况下,给对象赋予新的职责。github

以前咱们见识了鸭子的各个表现会飞、会游泳、会叫、会跳;也看过了气象台实时更新的能力,在看板里把数据更新;接下来咱们一块儿来喝下咖啡,体验一把喝咖啡的乐趣。咖啡店里的生意太好了,须要升级现有的产品,因此店主准备更新订单系统,以此来知足店内各位顾客。设计模式

先来看一张图,这是原先的店内设计
学习

看出什么来了吗?没错,就是各个类来知足对咖啡的不一样要求。那么,若是店内产品须要升级,好比购买咖啡时,想加入各类调料,例如:蒸奶,豆浆,摩卡或者覆盖奶泡。咖啡店根据不一样的调料,收取不一样的费用,因此有多少种调料,就有多少种类,是这个意思没错吧。而后,就会很悲剧,请看下面扩展调料以后的图编码


个人天,这是啥,这要是写了这样的项目,还不是分分钟要被哭死,维护这么多的类。设计

认识装饰者模式

当前遇到的问题就是:类数量爆炸、设计死板、以及基类加入的新功能并不适用于全部的子类。对象

因此,装饰者要隆重出场。在这里要采用不同的作法:咱们要以饮料为主体,而后再运行试以调料来“装饰”(decorate)饮料。加入某个顾客想要摩卡和奶泡深培咖啡,那么具体的作法就能够是:blog

  1. 拿一个深培咖啡(DarkRoast)对象
  2. 以摩卡(Mocha)对象装饰它
  3. 以奶泡(Whip)对象装饰它
  4. 调用cost方法,并依赖委托(delegate)将调料的价钱加上去

以装饰者构造饮料订单

为了让读者更加清晰的了解,小编在这里直接给了书中的图来表示继承

根据以上信息,咱们知道ip

  • 装饰者和被装饰对象有相同的超类型
  • 你能够用一个或多个装饰者包装一个对象
  • 既然装饰者和被装饰对象有相同的超类型,因此在任何须要原始对象(被包装的)的场合,能够用装饰过的对象代替它
  • 装饰者能够在所委托被装饰者的行为以前/或以后,加上本身的行为,以达到特定的目的---关键点
  • 对象能够在任什么时候候被装饰,因此能够再运行时动态地、不限量地用你喜欢的装饰者来装饰对象

来看看装饰者模式的定义吧。

定义装饰者模式

装饰者模式动态地将责任附加到对象上。若要扩展功能呢,装饰者提供了比继承更有弹性的替代方案。

那么咱们如何在现实中实际应用装饰者模式呢,先来看看根绝角色来分配的类图

装饰咱们的饮料

从上面的类图,看出什么了吗?想到咱们的饮料的类图怎么画了没呢。接下来,就让咱们照猫画虎,来画一个属于咱们的装饰类类图

鉴于以前有读者反映,说出现篇幅过长的状况。小编本身也曾疑惑,到底怎么更好地控制篇幅。因此,从今天开始,小编在力争保持思路一惯性的条件下,模块分的更细致,篇幅更加适中,让碎片化时间获得充分的利用。

因此,今天的学习就先到这里啦。下一篇,会针对类图进行实际的代码编写以及其余补充性的状况。你们也能够先根据代码,在伪代码的世界里实践下,也利于我们下次的编码实战。

PS:代码已经上传,须要查看的朋友点击此处HeadFirstDesign

爱生活,爱学习,爱感悟,爱挨踢

image

相关文章
相关标签/搜索