跳到主要內容
黯羽輕揚每天積累一點點

命令模式_JavaScript 設計模式 7

免費2015-07-24#JS#Design_Pattern#JavaScript命令模式

經典命令模式的實現需要請求者、命令、執行者,看起來很龐大,主要是因為強制類型檢查帶來的不便(必須依靠抽象類型來保證接口的統一),而 JS 是弱類型的,很容易實現命令模式,本文詳細介紹 JavaScript 實現的命令模式

一。命令模式

命令模式,封裝了方法調用細節,以解耦請求者與執行者

(引自 黯羽輕揚:設計模式之命令模式(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 設計模式》

評論

暫無評論,快來發表你的看法吧

提交評論