美文网首页
装饰模式--《HeadFirst设计模式》

装饰模式--《HeadFirst设计模式》

作者: 吕建雄 | 来源:发表于2021-03-17 13:00 被阅读0次

装饰模式:Decorator

动态地将责任附加到对象上。想要扩展功能,装饰者提供有别与继承的另一种选择。

代码中经常看到根据条件判断来进行附加操作的很多if...else...操作;比如:去咖啡店;

咖啡店的咖啡品类有好多种,比如:深培DarkRoast、低糖Decaf、混合HouseBlend...,各种品类的咖啡售价都不同,那么设计类的时候,最先想到的就是设计一个抽象的咖啡超类里面有抽象方法cost,各种品类的咖啡继承超类,重写cost方法,来实现各自的价格;(这么设计看似没问题)

后续随着新产品的调整,咖啡店开始增加不同口味辅料,比如:奶泡Whip、摩卡Mocha、豆浆Soy...,面对这样的调整,简单的做法就是在之前的类中添加上条件,针对不同的辅料添加不同的条件

比如:

if (Mocha) {

    cost + 0.6;

}else if (Whip){

    cost + 0.7;

}

这么设计能实现功能,但是将会面临很多的问题,比如要新增新的口味,必须修改类;删除口味也需要修改类,会给后续的维护带来很大的困扰;

以装饰者构造咖啡订单

咖啡组件 装饰类 具体调用

1、以DarkRoast对象开始

2、顾客想要摩卡Mocha,所以建立一个Mocha对象,并用它将DarkRoast对象包装起来

3、顾客也想要奶泡Whip,所以需要建立一个Whip装饰者,并用它将Mocha对象包起来。

4、现在该为顾客算钱啦,通过调用最外圈装饰者Whip的cost。Whip会先委托它装饰的对象(也就是Mocha)计算出价钱,Mocha会先委托它装饰的DarkRoast对象计算出价格在加上Mocha的价格交给装饰对象Whip,最后Whip对象使用返回的价格再加上自己的价格即可

装饰者模式

装饰者类图总结如上;

到目前所能知道关于装饰模式的一切

1、装饰者和被装饰者对象有相同的超类型

2、可以用一个或者多个装饰者包装一个对象

3、既然装饰者和被装饰者对象有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它

4、对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用喜欢的装饰者装饰对象

要点:

装饰者模式意味着一群装饰者类,这些类用来包装具体组件

装饰者类反映出被装饰的组件类型(事实上他们具有相同的类型,都经过接口或继承实现)

装饰者可以在被装饰者的行为前面或后面添加上自己的行为,甚至将被装饰者的行为整个替换掉,而达到特定的目的

装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂

装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

总结:

OO基础:

封装、继承、多态、抽象

OO原则:

封装变化

多用组合,少用继承

针对接口编程,不针对实现编程

为交互对象之间的松耦合设计而努力

对扩展开放,对修改关闭 --- 开闭原则

装饰模式具体实现代码

相关文章

  • 装饰模式--《HeadFirst设计模式》

    装饰模式:Decorator 动态地将责任附加到对象上。想要扩展功能,装饰者提供有别与继承的另一种选择。 代码中经...

  • 策略模式(详解)

    策略模式(来自HeadFirst设计模式) 今天看了 Head First 设计模式的第一个模式,居然是策略模式,...

  • HeadFirst 设计模式之策略模式

    title: HeadFirst 设计模式之策略模式 date: 2019-3-8 23:53:28 tags: ...

  • HeadFirst 设计模式之策略模式

    title: HeadFirst 设计模式之策略模式 date: 2019-3-8 23:53:28 tags: ...

  • HeadFirst设计模式3-装饰者模式

    1. 为何需要装饰者模式(why)   在我们的工作中,往往会这样的需求,就是动态地将责任附加到对象上,来达到拓展...

  • HeadFirst设计模式

    1.策略模式(Strategy Pattern) 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法...

  • HeadFirst设计模式

    设计模式入门 设计原则 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 针对接口...

  • HeadFirst设计模式

    设计原则一:把会变化的部分取出并“封装”起来,好让其他部分不受影响。 设计原则二:针对接口编程而不是针对实现编程。...

  • 9、结构型模式-装饰器设计模式

    1、如虎添翼的设计模式-装饰器设计模式 简介:讲解-装饰器设计模式介绍和应用场景 装饰器设计模式(Decorato...

  • HeadFirst设计模式-策略模式

    设计原则:1) 封装变化的部分 2) 针对接口编程,而不是针对实现变成 3)多用组合,少用继承 设计模式: 策略模...

网友评论

      本文标题:装饰模式--《HeadFirst设计模式》

      本文链接:https://www.haomeiwen.com/subject/ozcscltx.html