装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
举个例子
食街新开了一家奶茶店,店长需要考虑怎么加工制作奶茶比较好。奶茶有多种(原味、烧仙草、焦糖),在这基础上可以加的材料也有多种(冰、珍珠、青稞)。其他种类奶茶都以 未加工的奶茶 为基础进行加工制作。
一开始,店长是打算这样做的。 打个比方,店员A负责焦糖奶茶的制作,店员B负责在焦糖奶茶的基础上加冰,店员C负责在焦糖加冰的基础上加青稞,店员D负责在焦糖奶茶的基础上加青稞。以此类推。
按这个计划,店长算了一下需要的人手, 三种奶茶最基本的制作(原味、烧仙草、焦糖)需要3名店员,(焦糖+冰、焦糖+珍珠、焦糖+青稞、焦糖+冰+珍珠、焦糖+冰+青稞、焦糖+珍珠+青稞、焦糖+冰+珍珠+青稞)一种奶茶加材料有需要7名店员,总共 需要招 3+3*7 = 24 名店员 。
算到这,突然想到,如果将来添加新种类的奶茶或材料(糖、布丁),那不是又要招很多人。
想到这,店长脸就黑了,生意虽然好,招这么多店员,店员都快比客户多了,还赚什么钱,管理也不容易,不行,这个方案不行!
“ 可以解决问题,但层层继承,子类会比较膨胀,耦合性太强 ” 说的就是上面这种情况。
在苦苦思考中,店长灵光一闪,想到了之前看到的装饰器模式,发现了在材料的添加上耗费了很多人力,就又制定了一个方案。 打个比方,店员A负责焦糖奶茶的制作,店员B负责在各种奶茶的加冰操作,店员C负责在各种奶茶的加青稞操作,店员D负责在各种奶茶的加珍珠操作。以此类推。
按这个方案,店长又算了一下需要的人手,三种奶茶最基本的制作(原味、烧仙草、焦糖)还是需要3名店员,三种材料的添加(冰、珍珠、青稞)只需要3名店员,总共 需要招 3+3 = 6 名店员。如果将来添加新种类的奶茶或材料(糖、布丁),也只是需要多几个人而已。
诶,这个方案可行,店长笑了,有钱赚,又方便管理。
“ 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 ”
另外,店长也注意到了,对于客户的需求,一杯奶茶可能要经过多个负责材料添加的店员。这个时候就需要做好 加工分配的流程,虽然这个可能会复杂点,但店长可以接受。
“ 多层装饰使用起来相对比较复杂 ”
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
注意事项:可代替继承。
共同学习,共同进步,若有补充,欢迎指出,谢谢!