JavaScript 命令模式

2018-08-02 16:25 更新

命令模式

命名模式的目標(biāo)是將方法的調(diào)用,請(qǐng)求或者操作封裝到一個(gè)單獨(dú)的對(duì)象中,給我們酌情執(zhí)行同時(shí)參數(shù)化和傳遞方法調(diào)用的能力.另外,它使得我們能將對(duì)象從實(shí)現(xiàn)了行為的對(duì)象對(duì)這些行為的調(diào)用進(jìn)行解耦,為我們帶來(lái)了換出具體的對(duì)象這一更深程度的整體靈活性。

具體類(lèi)是對(duì)基于類(lèi)的編程語(yǔ)言的最好解釋,并且同抽象類(lèi)的理念聯(lián)系緊密.抽象類(lèi)定義了一個(gè)接口,但并不需要提供對(duì)它的所有成員函數(shù)的實(shí)現(xiàn).它扮演著驅(qū)動(dòng)其它類(lèi)的基類(lèi)角色.被驅(qū)動(dòng)類(lèi)實(shí)現(xiàn)了缺失的函數(shù)而被稱為具體類(lèi). 命令模式背后的一般理念是為我們提供了從任何執(zhí)行中的命令中分離出發(fā)出命令的責(zé)任,取而代之將這一責(zé)任委托給其它的對(duì)象。

實(shí)現(xiàn)明智簡(jiǎn)單的命令對(duì)象,將一個(gè)行為和對(duì)象對(duì)調(diào)用這個(gè)行為的需求都綁定到了一起.它們始終都包含一個(gè)執(zhí)行操作(比如run()或者execute()).所有帶有相同接口的命令對(duì)象能夠被簡(jiǎn)單地根據(jù)需要調(diào)換,這被認(rèn)為是命令模式的更大的好處之一。

為了展示命令模式,我們創(chuàng)建一個(gè)簡(jiǎn)單的汽車(chē)購(gòu)買(mǎi)服務(wù):

(function(){

  var CarManager = {

      // request information
      requestInfo: function( model, id ){
        return "The information for " + model + " with ID " + id + " is foobar";
      },

      // purchase the car
      buyVehicle: function( model, id ){
        return "You have successfully purchased Item " + id + ", a " + model;
      },

      // arrange a viewing
      arrangeViewing: function( model, id ){
        return "You have successfully booked a viewing of " + model + " ( " + id + " ) ";
      }

    };

})();

看一看上面的這段代碼,它也許是通過(guò)直接訪問(wèn)對(duì)象來(lái)瑣碎的調(diào)用我們CarManager的方法。在技術(shù)上我們也許都會(huì)都會(huì)對(duì)這個(gè)沒(méi)有任何失誤達(dá)成諒解.它是完全有效的Javascript然而也會(huì)有情況不利的情況。

例如,想象如果CarManager的核心API會(huì)發(fā)生改變的這種情況.這可能需要所有直接訪問(wèn)這些方法的對(duì)象也跟著被修改.這可以被看成是一種耦合,明顯違背了OOP方法學(xué)盡量實(shí)現(xiàn)松耦合的理念.取而代之,我們可以通過(guò)更深入的抽象這些API來(lái)解決這個(gè)問(wèn)題。

現(xiàn)在讓我們來(lái)擴(kuò)展我們的CarManager,以便我們這個(gè)命令模式的應(yīng)用程序得到接下來(lái)的這種效果:接受任何可以在CarManager對(duì)象上面執(zhí)行的方法,傳送任何可以被使用到的數(shù)據(jù),如Car模型和ID。

這里是我們希望能夠?qū)崿F(xiàn)的樣子:

CarManager.execute( "buyVehicle", "Ford Escort", "453543" );

按照這種結(jié)構(gòu),我們現(xiàn)在應(yīng)該像下面這樣,添加一個(gè)對(duì)于"CarManager.execute()"方法的定義:

CarManager.execute = function ( name ) {
    return CarManager[name] && CarManager[name].apply( CarManager, [].slice.call(arguments, 1) );
};

最終我們的調(diào)用如下所示:

CarManager.execute( "arrangeViewing", "Ferrari", "14523" );
CarManager.execute( "requestInfo", "Ford Mondeo", "54323" );
CarManager.execute( "requestInfo", "Ford Escort", "34232" );
CarManager.execute( "buyVehicle", "Ford Escort", "34232" );
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)