1616} ) ;
1717</ script >
1818
19+ 2. 用对象的多态性消除条件分支
20+ 参见 1.3 多态
1921
22+ 3. 找出变化的地方
23+ 封装程序中变化的部分
24+ 例如:动物的叫声不同,而动物都会叫这是不变的,于是封装 makeSound 成一个稳定和封闭的函数
2025
26+ 其他辅助实现开闭原则代码的方法:
27+ 3.1 放置挂钩(hook)
28+ 参见 11.2 钩子方法
29+ 3.2 使用回调函数
30+ 函数可以作为参数传递给另外一个函数,这是高阶函数的意义之一,我们通常会把这个函数称为回调函数。
31+ 在 JavaScript 版本的设计模式中,策略模式和命令模式等都可以用回调函数轻松实现。
32+ 回调函数是一种特殊的挂钩,我们可以把一部分易于变化的逻辑封装在回调函数里,然后把回调函数当作参数传入一个稳定和封闭的函数中。
2133
34+ 4. 设计模式中的开放-封闭原则
35+ 4.1 发布-订阅模式
2236
37+ 4.2 模板方法模式
2338
39+ 4.3 策略模式
2440
41+ 4.4 代理模式
2542
26-
27- < script >
28- var makeSound = function ( animal ) {
29- if ( animal instanceof Duck ) {
30- console . log ( '嘎嘎嘎' ) ;
31- } else if ( animal instanceof Chicken ) {
32- console . log ( '咯咯咯' ) ;
33- }
34- } ;
35-
36- var Duck = function ( ) { } ;
37- var Chicken = function ( ) { } ;
38- makeSound ( new Duck ( ) ) ; // 输出:嘎嘎嘎
39- makeSound ( new Chicken ( ) ) ; // 输出:咯咯咯
40-
41-
42-
43- var makeSound = function ( animal ) {
44- if ( animal instanceof Duck ) {
45- console . log ( '嘎嘎嘎' ) ;
46- } else if ( animal instanceof Chicken ) {
47- console . log ( '咯咯咯' ) ;
48- } else if ( animal instanceof Dog ) { // 增加跟狗叫声相关的代码
49- console . log ( '汪汪汪' ) ;
50- }
51- } ;
52-
53-
54-
55- var Dog = function ( ) { } ;
56- makeSound ( new Dog ( ) ) ; // 增加一只狗
57-
58- var makeSound = function ( animal ) {
59- animal . sound ( ) ;
60- } ;
61- var Duck = function ( ) { } ;
62- Duck . prototype . sound = function ( ) {
63- console . log ( '嘎嘎嘎' ) ;
64- } ;
65- var Chicken = function ( ) { } ;
66- Chicken . prototype . sound = function ( ) {
67- console . log ( '咯咯咯' ) ;
68- } ;
69- makeSound ( new Duck ( ) ) ; // 嘎嘎嘎
70- makeSound ( new Chicken ( ) ) ; // 咯咯咯
71- /********* 增加动物狗,不用改动原有的makeSound 函数 ****************/
72- var Dog = function ( ) { } ;
73- Dog . prototype . sound = function ( ) {
74- console . log ( '汪汪汪' ) ;
75- } ;
76- makeSound ( new Dog ( ) ) ; // 汪汪汪
77-
78- </ script >
79-
80-
81- < script >
82-
83- var getUserInfo = function ( callback ) {
84- $ . ajax ( 'http:// xxx.com/getUserInfo' , callback ) ;
85- } ;
86- getUserInfo ( function ( data ) {
87- console . log ( data . userName ) ;
88- } ) ;
89- getUserInfo ( function ( data ) {
90- console . log ( data . userId ) ;
91- } ) ;
92-
93- var arrayMap = function ( ary , callback ) {
94- var i = 0 ,
95- length = ary . length ,
96- value ,
97- ret = [ ] ;
98- for ( ; i < length ; i ++ ) {
99- value = callback ( i , ary [ i ] ) ;
100- ret . push ( value ) ;
101- }
102- return ret ;
103- }
104- var a = arrayMap ( [ 1 , 2 , 3 ] , function ( i , n ) {
105- return n * 2 ;
106- } ) ;
107- var b = arrayMap ( [ 1 , 2 , 3 ] , function ( i , n ) {
108- return n * 3 ;
109- } ) ;
110-
111- console . log ( a ) ; // 输出:[ 2, 4, 6 ]
112- console . log ( b ) ; // 输出:[ 3, 6, 9 ]
113-
114- </ script >
43+ 4.5 职责链模式
0 commit comments