《Head First Design Patterns》
# # 《Head First Design Patterns》
这是一本十分经典的关于设计模式的书,以前阅读过这本书,这次重新阅读又增加了新的理解。书本中一些经典案例的讲解,联系到平时工作中的应用,对设计模式有了更加深入的思考。这里给出工作中总结的常用JS设计模式
# # 设计原则
- 找出应用中可能需要变化之处,把它们独立出来,不要把和那些不变化的代码混合在一起
// bad
// 飞行技能和叫声不是每只鸭子都会的(比如橡皮鸭),所以不能放在鸭子Duck基类中
class Duck {
// common
eat();
sleep();
// special
fly()
quack()
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 针对接口编程,而不是针对实现编程
Dog d = new Dog() // 针对实现编程
Animal d = new Dog() // 针对接口编程(Dog extend Animal)
1
2
3
2
3
- 多用组合,少用继承
// bad
// 飞行和叫声是接口,需要每次都实现,不好
class RedHeadDuck extend Duck interfaces IFly, IQuack {
}
// good
class RedHeadDuck extend Duck {
FlyBehavior fly;
QuackBehavior quack;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# # 设计模式
# # 观察者模式
- 特点是一对多
- 需要有订阅关系(这样发布才通知的到)
# # 迭代器模式
- 提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露其内部的表示。
- 即不同的迭代方式换成统一的iterator.next()
# # 组合模式
- 允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象与组合对象。
# # 模版方法
- 在一个方法中定义算法的骨架,而将一些步骤延迟到子类。
- 模板方法可以在不改变结构算法的基础上,重新定义算法中的某些步骤
# # 命令模式
- 将“请求“封装成对象,以便使用不同的请求来参数化其他对象。
- eg:n种缓存方式 + 缓存管理类(管理类面向最终用户,但内部调用还是使用缓存)
// n种缓存方式
class LocalStorage extend ICache{}
class ObjectStorage extend ICache{}
...
// 管理类
class CacheManage {
constructor(ICache cache){
this.cache = cache
}
get() {
return this.cache.get()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编辑 (opens new window)