装饰模式

设计模式之装饰者模式

混江龙づ霸主 提交于 2019-11-26 07:31:23
首先让我们看一下装饰者模式(我爱叫他套娃模式)的概念:动态的将责任附加到对象上, 若要扩展功能,装饰者 提供了比继承者更有弹性的集成方案。 什么?没看懂?没关系,最后再来看这个概念,想让让我们来看一个咖啡屋项目(就是点各式 各样的咖啡)。 原本的设计如下: 看似很好的设计,但是别忘了,买咖啡时候我们会让他们给我们加一系列的调料,例如蒸奶、 摩卡......。所以,在这时咖啡店的设计就变成了,如下: 不错,你看到了 类爆炸 ! 好啦,现在有对这个系统做出了改进,如下: 好啦,现在这个设计相比之前的的确好了许多,但是如果我们要修改配料呢?那么就必须修改 超类,这时候就违反了一条 设计原则:类应该对扩展开放,对修改关闭 ! 所以这个时候,装饰者模式单诞生了!!!!! 来看个例子: 如果顾客现在要一杯摩卡和奶泡深培咖啡。那么,要做的是: ①拿一个深培咖啡(DarkRoast)对象 ②以摩卡(Mocha)对象装饰它 ③以奶泡(Whip)装饰它 ④调用cost()方法,并依赖委托(delegate)将调料的几千加上去 如何工作? ①以DarkRoast对象开始 ②顾客想要摩卡(Mocha),所以建立一个Mocha对象,并用它将DarkRoast对象包起来 ③顾客也想要奶泡(Whip),所以建立一个Whip装饰者,并用它将Mocha对象包起来。别 忘了,DarkRoast继承自Beverage

HeadFirst设计模式<2>

只愿长相守 提交于 2019-11-26 00:25:33
HeadFirst设计模式<2> 1 装饰者模式 星巴克咖啡 饮料 总结 如果说策略模式是通过组合实现弹性,那么装饰者模式就是通过继承来实现,在实现的同时,客户基本感觉不到使用了装饰者模式 2 适配器模式 对象适配器 类适配器 火鸡 总结 适配器模式和装饰者模式非常像,适配器模式是适配对象接口,而装饰者模式不改变对象接口的情况下给对象新的职责。 来源: https://www.cnblogs.com/lovexinyi/p/11932161.html

装饰器模式(Decorator)

元气小坏坏 提交于 2019-11-25 22:33:54
  装饰器模式是JAVA开发过程中常用的一种设计模式,该设计模式用于对类进行横向的功能扩展,也就是达到对类进行“装饰”的目的。JDK中的缓冲流便是使用了装饰类模式。   装饰器模式的类图一般如下:      以实体类基类的引用为入参,装饰类可以装饰整个继承链上的实体类。   很多刚刚接触装饰模式的开发者可能会认为,为一个类增加一个装饰类多此一举,使用继承也可以对类的功能进行扩展。   但其实装饰模式的核心在于“装饰”,它是一种横向的扩展,并不影响原来类的核心功能和定位。另外通过向上转型传入参数,装饰类可以使用同一个引用并装饰一条继承链中的所有类,具有很好的通用性和可读性。   比如有如下场景,我们有一条继承链:      代码如下:   货车省略。。。   公交车、出租车、货车都是汽车的子类,它们同时拥有 run() 方法且都有自己的实现(都重写了父类的run()方法)。如果我们在后期考虑到,碰到大雾情况,汽车在行驶之前需要开启雾灯。如果不使用装饰模式,我们必须在每个子类的run()方法中加上“开启雾灯”,这样做显然会产生很多重复代码,不够优雅。   现在我们来定义一个装饰器CarDecorator如下:   将一个Car的实例传入装饰器,并执行car的run方法。该类只是一个声明,后续所有的装饰器都会集成自该类。因为我们并不一定只需要开启雾灯的装饰类