一。命令模式
命令模式,封裝了方法調用細節,以解耦請求者與執行者
(引自 黯羽輕揚:設計模式之命令模式(Command Pattern))
這就是命令模式的核心,在調用者和執行者之間插入命令層,先前的調用者就變成請求者了,不直接調用執行者,而是向系統發出命令請求;此時系統變成了調用者,負責調度命令(直接發送給執行者,或者加以控制,在滿足一定條件時再發);執行者還是執行者,只是與先前的調用者解除耦合關係了
二。經典實現方式
Java 實現請查看 黯羽輕揚:設計模式之命令模式(Command Pattern)
文中例子給的非常恰當,無須贅述
三。JavaScript 實現命令模式
JavaScript 實現其實是一個簡化版,功能相對弱一些,但實現起來相當簡單,示例代碼如下:
var module = {
// 命令(統一入口)
exec: function(cmd) {
/**
* Array.prototype.slice.call(arguments, 1) 是一個小技巧
* 用來把 arguments 對象轉換為數組並切掉第一個參數(此處是 cmd 的值)
*/
return this[cmd] && this[cmd].apply(this, Array.prototype.slice.call(arguments, 1));
},
// 公開接口 1
sum: function(a, b) {
return a + b;
}
// 公開接口 2...
}
var sum = module.exec('sum', 1, 2);
console.log(sum); // 3
這樣的實現相當簡潔(我們的命令模式只有一行代碼),沒有必要模擬出經典實現中用於約束類型的多餘抽象
四。命令模式與外觀模式
仔細一想,這不和外觀模式一樣嘛,都是對現有接口進行封裝。確實很相似,唯一的差異是命令模式側重於提供統一入口(加以控制),而外觀模式是為了讓接口更加易用對現有接口進行二次封裝(不一定非要統一一個入口,完全可以提供一組新接口)
可以這樣理解,如果外觀提供的接口只有一個,此時就是命令模式了。對現有接口進行封裝後提供的新接口的個數是區分二者的關鍵,命令模式只能有一個(示例中的 exec),外觀模式沒有限制,只要新接口比原接口好用就行
參考資料
- 《JavaScript 設計模式》
暫無評論,快來發表你的看法吧