zoukankan      html  css  js  c++  java
  • 设计模式之 装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

    这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    举个例子

      食街新开了一家奶茶店,店长需要考虑怎么加工制作奶茶比较好。奶茶有多种(原味、烧仙草、焦糖),在这基础上可以加的材料也有多种(冰、珍珠、青稞)。其他种类奶茶都以 未加工的奶茶 为基础进行加工制作。

    一开始,店长是打算这样做的。 打个比方,店员A负责焦糖奶茶的制作,店员B负责在焦糖奶茶的基础上加冰,店员C负责在焦糖加冰的基础上加青稞,店员D负责在焦糖奶茶的基础上加青稞。以此类推。

    按这个计划,店长算了一下需要的人手, 三种奶茶最基本的制作(原味、烧仙草、焦糖)需要3名店员,(焦糖+冰、焦糖+珍珠、焦糖+青稞、焦糖+冰+珍珠、焦糖+冰+青稞、焦糖+珍珠+青稞、焦糖+冰+珍珠+青稞)一种奶茶加材料有需要7名店员,总共 需要招 3+3*7 = 24 名店员 。

    算到这,突然想到,如果将来添加新种类的奶茶或材料(糖、布丁),那不是又要招很多人。

    想到这,店长脸就黑了,生意虽然好,招这么多店员,店员都快比客户多了,还赚什么钱,管理也不容易,不行,这个方案不行!

    “ 可以解决问题,但层层继承,子类会比较膨胀,耦合性太强 ” 说的就是上面这种情况。

      在苦苦思考中,店长灵光一闪,想到了之前看到的装饰器模式,发现了在材料的添加上耗费了很多人力,就又制定了一个方案。 打个比方,店员A负责焦糖奶茶的制作,店员B负责在各种奶茶的加冰操作,店员C负责在各种奶茶的加青稞操作,店员D负责在各种奶茶的加珍珠操作。以此类推。

    按这个方案,店长又算了一下需要的人手,三种奶茶最基本的制作(原味、烧仙草、焦糖)还是需要3名店员,三种材料的添加(冰、珍珠、青稞)只需要3名店员,总共 需要招 3+3 = 6 名店员。如果将来添加新种类的奶茶或材料(糖、布丁),也只是需要多几个人而已。

    诶,这个方案可行,店长笑了,有钱赚,又方便管理。

    “ 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 ”

      另外,店长也注意到了,对于客户的需求,一杯奶茶可能要经过多个负责材料添加的店员。这个时候就需要做好 加工分配的流程,虽然这个可能会复杂点,但店长可以接受。

    “ 多层装饰使用起来相对比较复杂 ”

    优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    缺点:多层装饰比较复杂。

    使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

    注意事项:可代替继承。

    共同学习,共同进步,若有补充,欢迎指出,谢谢!

  • 相关阅读:
    spring1--概念引入
    spring1.1--约束文件
    MYSQL--慎用group_concat()
    MySql--存储过程之循环遍历查询结果集
    go type func() 自定义函数类型
    go type func() 自定义函数类型
    go中 type func()用法分析
    beego邮件发送
    beego邮件发送
    go 利用beego orm的数据库设计
  • 原文地址:https://www.cnblogs.com/dengguangxue/p/11690711.html
Copyright © 2011-2022 走看看