标签:
以前没有接触过装饰者模式,昨天简单研究了一下,记录一下,为以后进一步学习铺垫一下,刚刚接触,有不对的地方欢迎大家指正。
首先,什么是装饰者模式?
先举个例子来说,就像是一条生产蛋糕的流水线,你不能用这条流水线去生产汽车,更不能去生产坦克吧,当然你也生产不了。你的蛋糕生产出来了,要保存吧,要销售吧,你总不能把人家要吃的东西直接放地上直接放在车上吧,因此你需要盒子,你需要蛋糕的底座,那么盒子和底座就是你对蛋糕的包装,也就是装饰。至于盒子和底座的颜色啊,形状啊,你完全可以多种多样,想怎么组合就怎么组合。
例子可能不太恰当,但是道理却是这样的。装饰者模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。这是官方的解 释,什么意思呢?就是说现在又一个类,你不能去改变这个类,也不能去改变这个类原来的继承关系,但是还要动态的去扩展这个类的实例化的一个对象的功能,怎 么扩展对象的功能呢?去创建一个新的包装对象,用你创建的包装对象去将原来的对象包裹起来,以达到扩展原来对象的目的。
其次,装饰者模式有什么特点?
1.装饰者和被装饰者有继承自相同的超类。
2.被装饰者可以被多个装饰者同时装饰。
还是上面的生产蛋糕,你可以在蛋糕上加上奶油,那就变成了奶油蛋糕,加了奶油之后你又想吃水果,那你还可以在加了奶油的蛋糕上加上水果,加了水果你还觉得不爽,还想加点 巧克力,这是完全可以的。不管你想吃什么都可以往上加(加多了最后还能不能吃我就不知道了,大家可以试试),蛋糕东西加多了可能不能吃,但是被修饰者却是可以被多个修饰者同时 修饰的,但是修饰者的数量和修饰者添加的顺序要根据具体的需求来添加,并不是说可以被多个修饰者修饰那么就可以随便添加,你给蛋糕加四个汽车轱辘试试,看看会不会有人不打死 你?
3.装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实 现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者 可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可 以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要 修改原程序了。
4.与继承的区别
学JAVA的,大家肯定也知道什么是继承,我就不废话了。初看装饰者模式真的很像继承,但是仔细看的话还是有很大区别的。使用继承进行功能扩展,那么你要扩展的这些功能必 须是可以预见的,在编译阶段就已经确定了,在运行期不可改变,是静态的,并且所有的子类都会继承到相同的行为。但是装饰者模式对于功能的扩展是可变的,装饰者模式利用组合的 方法扩展对象的行为,就可以再运行时动态的扩展。
标签:
原文地址:http://www.cnblogs.com/liaidai/p/4434314.html