1
- 装饰者模式<br />
1
+ <h3 >装饰者模式</h3 >
2
+ <br />
2
3
实例:创建自行车的装饰者<br />
3
4
1、接口在装饰者模式中的角色:<br />
4
- 装饰者模式颇多得益于接口的使用。装饰者最重要的特点之一就是它可以用来替代其组件。<br />
5
+ 装饰者模式颇多得益于接口的使用。装饰者最重要的特点之一<br />
6
+ 就是它可以用来替代其组件。<br />
5
7
接口说明了装饰者必须实现哪些方法,有助于防止开发过程中的错误。<br />
6
- 如果装饰者对象与其组件不能互换使用,它就丧失了其功用。这是装饰者模式的关键特点,要注意防止装饰者和组件出现的接口方法的差异。这种模式的好处之一就是可以透明的用新对象装饰现有系统中的对象,这并不会改变代码中的其他东西,只有装饰者和组件实现了同样的接口才能做到这一点。<br />
8
+ 如果装饰者对象与其组件不能互换使用,它就丧失了其功用。这是装饰者模式的关键特点,要注意防止装饰者和组件出现的接口方法的差异。
9
+ 这种模式的好处之一就是可以透明的用新对象装饰现有系统中的对象,
10
+ 这并不会改变代码中的其他东西,只有装饰者和组件实现了同样的接口才能做到这一点。<br />
7
11
2、装饰者模式与组合模式的比较:<br />
8
12
相同点:<br />
9
13
装饰者对象和组合对象都是用来包装别的对象(组合模式:子对象,装饰者模式:组件)<br />
10
14
都与所包装的对象实现同样的接口并且会把任何方法调用传递给这些对象<br />
11
15
不同点:<br />
12
- 组合模式是一种结构型模式,用于把众多子对象组织为一个整体。通常并不需要修改方法调用,而只是将其沿组合对象与子对象的链向下传递,直到到达并落实在叶对象上。装饰者模式也是一种结构型模式,但它并非用于组织对象,而是用于在不修改现有对象或从派生子类的前提下为其增添职责。创建装饰者的目的就在于对方法进行修改,其做法是先传递方法调用,然后修改其返回结果。<br />
16
+ 组合模式是一种结构型模式,用于把众多子对象组织为一个整体。通常并不需要修改方法调用,而只是将其沿组合对象与子对象的链向下传递,直到到达并落实在叶对象上。
17
+ 装饰者模式也是一种结构型模式,但它并非用于组织对象,
18
+ 而是用于在不修改现有对象或从派生子类的前提下为其增添职责。创建装饰者的目的就在于对方法进行修改,其做法是先传递方法调用,然后修改其返回结果。<br />
13
19
组合对象不修改方法调用,着眼在于组织对象,而装饰者存在的唯一目的就是修改方法调用而不是组织子对象,因为子对象只有一个。<br />
14
20
3、装饰者修改其组件的方式<br />
15
21
在方法之后添加行为<br />
22
28
详细的例子:<a href =" https://github.com/wchaowu/javascript-code/blob/master/JavaScript-Design-Patterns/The-Decorator-Pattern/1%20-%20Structure%20of%20the%20decorator.js " >example</a ><br />
23
29
4、工厂的角色<br />
24
30
如果必须确保按照某种特定顺序创建装饰者,那么可以为此使用工厂对象。实际上,不管顺序是否要紧,工厂都很适合于创建装饰对象。<br />
25
- 用工厂实例化自行车对象有许多好处。首先,不必了解自行车和装饰者的各种类名,所有这些信息都封装在AcmeBicycleShop类中。因此添加自行车型号和选件非常容易,只要把它们添加到AcmeBicycleShp.models或AcmeBicycleShop.options数组中即可。<br />
31
+ 用工厂实例化自行车对象有许多好处。首先,不必了解自行车和装饰者的各种类名,所有这些信息都封装在AcmeBicycleShop类中。因此添加自行车型号和选件非常容易,
32
+ 只要把它们添加到AcmeBicycleShp.models或AcmeBicycleShop.options数组中即可。<br />
26
33
例子:<br />
27
34
<a href =" https://github.com/arthinking/Javascript/blob/master/Pro-JavaScript-Design-Patterns/Chapter12-The-Decorator-Pattern/12.03%20-%20The%20role%20of%20the%20factory.js " >
28
35
AcmeBicycleShop类的createBicycle方法,以便用户可以指定自行车要配的选件。
@@ -43,4 +50,4 @@ AcmeBicycleShop类的createBicycle方法,以便用户可以指定自行车要
43
50
装饰者的运行过程是透明的,这就是说你可以用它包装其他对象,然后继续按之前使用那些对象的方法来使用它。装饰者为程序员带来了极大的灵活性。<br />
44
51
8、装饰者模式之弊<br />
45
52
在遇到用装饰者包装起来的对象时,那些依赖于类型检查的代码会出问题。<br />
46
- 使用装饰者模式往往会增加架构的复杂程度。此外,实现具有动态接口的装饰者(如MethodProfiler)涉及的语法细节有时也会令人生畏。在设计一个使用了装饰者模式的架构时,你西部多花点心思 ,确保自己的代码有良好的文档说明,并且容易理解。
53
+ 使用装饰者模式往往会增加架构的复杂程度。此外,实现具有动态接口的装饰者(如MethodProfiler)涉及的语法细节有时也会令人生畏。在设计一个使用了装饰者模式的架构时,你需要多花点心思 ,确保自己的代码有良好的文档说明,并且容易理解。
0 commit comments