目的
- 需求的变更,不需要重写
- 代码修改不会引起大规模变动
- 方便加入新模块
提高可扩展性的设计模式
更好的更改代码
适配器模式-目标是接口
- 目的: 通过写一个适配器,用代替替换
- 应用场景: 面临接口不通用的问题
基本结构:
// 需求: 想用lo个来代替console.log
var log = (function(){
return window.console.log
})()
装饰者模式-目标是方法作用
目的:不重写方法的的时候扩展方法
- 应用场景: 当一个方法需要扩展, 但是又不好去修改方法
- 基本结构 ```javascript // 需求: 我们新建一个自己的方法, 在其内部调用b方法,并且再执行自己的方法。 //这样可以在不修改源对象的情况下,扩展行为
// 有一个他人写好的模块a内部的方法b模块为他人写好, 不能修改, 如何扩展b方法 var a = { b: function(){ } }; function myB(){ a.b(); // 要扩展的方法 }
<a name="4ded5b14"></a>
## 解耦你的方法与调用
<a name="L09PB"></a>
### 命令模式
- 目的:解耦实现和调用, 让双方互不干扰
- 应用场景:调用的命令充满不确定性
- 基本结构
```javascript
var command = (function(){
var action = {};
return function excute(){}
})
提高可扩展性(下)-模块层面
提高整体项目可扩展性的核心
- 低耦合
-
应对需求上的变更
观察者模式(订阅、发布模式)-比如事件绑定
- 目的: 减少对象间的耦合,来提高扩展性
- 应用场景:当两个模块直接沟通会增加他们的耦合性时
基本结构
// 观察者模式
// 定义一个中转观察者,两个模块之间不直接沟通,而是通过观察者,一般适用于不方便直接沟通,或者异步操作
function observe(){
this.message = {};
}
//注册监听的type
observe.prototype.regist = function(type, fn){
this.message[type] = fn;
}
// 触发注册的喊出
observe.prototype.fire = function(type,){
this.message[type]();
}
// 删除注册的回调
observe.prototype.remove = function(type){
this.message[type]();
}
职责链模式
目的:为了避免请求发送者与多个请求处理者耦合在一起,形成一个链条
- 应用场景:把操作分割成一系列模块,每个模块只处理自己的事情
基本结构
// 把要做的事情组织为一条有序的链条,通过这条链传递消息来完成功能,适用于不涉及到复杂异步的操作
function mode1(){}
function mode2(){}
function mode3(){}
_result=mode1(_result);
_result=mode2(_result);
_result=mode3(_result);
访问者模式
目的: 解耦数据结构与数据的操作
- 应用场景:数据结构不希望与操作有关
// 访问者模式
// 通过定义一个访问者,代替直接访问对象,来减少两个对象之间的耦合
var data = [];
var handler = function(){};
handler.prototype.get= function(){}
var vistor = function(handler, data){
handler.get(data);
}