美文网首页
装饰模式--《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设计模式》

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