发表于: 2017-07-24 23:21:00
2 868
什么叫装饰者模式?---也被称为Decorator模式
它被称为包装者模式,能够拓展对象的功能,是继承关系的一个替代方法。他能够在不创建更多子类的前提下进行功能的拓展。
因此,装饰者模式相比利用生成子类方式来进行功能的扩充来说,显得更为灵活。因为频繁使用继承来实现功能拓展会生成很多子类,从而增加系统的复杂性。而且使用继承的话,我们必须能够预见这些所拓展而来的功能,也就是说这些功能在编译的时候就是确定的,是静态的。
要点概括:
装饰者模式不需要创建子类
装饰者与被装饰者拥有共同的超类,而继承的目的是为了继承类型,而不是行为。
他的拓展是完全透明的,而且包裹的是真实的对象
按照网上的栗子自己写了个简单的test,效果如下

其中Test的代码是

这个装饰用了三层,整个流程是这样的:
首先我创建接口Person,然后让Decorator抽象类持有这个接口,也就是说方法全部委托给这个接口让他调用。
我感觉自己像是倒着剥洋葱一样从核心开始一层一层往外加东西,最开始的装饰类是很单薄的,也从最简单的事情写起,到后来可以加的东西越来越多,而在实际测试的时候你想要进行到哪个程度完全是你自己说了算,就好像通过继承来进行功能的拓展是一次又一次的物种进化,你突然要他退化那就很为难。装饰者模式更像是一层一层穿衣服,你突然让他脱下衣服。。。
Decorator抽象类中的子类,也就是抽象类的子类,都会有一个构造方法来进行调用super(person),因为抽象类是由子类实现。而且加了super又会产生一种链式反应的感觉,会从最上方调用方法,然后一层一层下来到自己的装饰类方法。
那么 问题来了。
Decorator decorator = new Decorator_second(
new Decorator_first(new Decorator_zero(player)));
这一段讲的是什么?
首先实例化一个对象,然后new的时候,是依据Decorator_second来进行的,但是很不幸Decorator_second的构造方法中,有一个super。。所以要先根据Decorator_first进行构造,但是很不幸。。。总之是从最初的player开始的。
反正就是感觉装饰者模式进行考虑会比较层层递进的感觉。
装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者抽象类,只需继承装饰者抽象类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则,这是自己理解的装饰者模式。
这个是资料里的原文,作为总结,怕不是说的是俄罗斯套娃。
-----17/7/24
好像格式要加明天的计划。。临时加一下==
明天要搞一下多线程(任务1)
然后整理下生产者和消费者模型(任务2)
来得及的话,顺便加一下jdk1.8的新特性(额外任务3)
//整理个东西的时间还是挺久的。。下次早点整理
//至于我接的任务1,看缘分
评论