2017-02-24 11 views
0

私はコマンドパターンを読んでいますが、コマンドパターンを示すためにブリッジ+コマンドパターンを使用しているようなサイトの例があります。Bridge +コマンドパターン

だから、最初、ウィキペディアから:https://en.wikipedia.org/wiki/Command_pattern、コマンドパターンの定義:

コマンドパターンは、オブジェクト がアクションを実行するために必要なすべての情報をカプセル化するために使用されている行動のデザインパターンがありますか イベントを後でトリガーします。この情報には、メソッド の名前、メソッドを所有するオブジェクト、メソッド の値が含まれます。

この定義では、コマンドパターンはかなりわかりやすく、ここにある本:https://addyosmani.com/resources/essentialjsdesignpatterns/book/#commandpatternjavascriptを読んでいるように見えますが、この例ではそのとおりです。

(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 + ") "; 
    } 

    }; 

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

    console.log(carManager.execute("arrangeViewing", "Ferrari", "14523")); 
    console.log(carManager.execute("requestInfo", "Ford Mondeo", "54323")); 
    console.log(carManager.execute("requestInfo", "Ford Escort", "34232")); 
    console.log(carManager.execute("buyVehicle", "Ford Escort", "34232")); 

})(); 

この例では余分なものはありませんが、私はコマンドパターンしか見ることができません。しかし、バックウィキペディアに、彼らはコマンドパターンを紹介する次の例を使用します。

class Switch { 
    constructor() { 
    this._commands = []; 
    } 

    storeAndExecute(command) { 
    this._commands.push(command); 
    command.execute(); 
    } 
} 

class Light { 
    turnOn() { console.log('turn on') } 
    turnOff() { console.log('turn off') } 
} 

class FlipDownCommand { 
    constructor(light) { 
    this._light = light; 
    } 

    execute() { 
    this._light.turnOff(); 
    } 
} 

class FlipUpCommand { 
    constructor(light) { 
    this._light = light; 
    } 

    execute() { 
    this._light.turnOn(); 
    } 
} 

var light = new Light(); 
var switchUp = new FlipUpCommand(light); 
var switchDown = new FlipDownCommand(light); 
var s = new Switch(); 

s.storeAndExecute(switchUp); 
s.storeAndExecute(switchDown); 

私は上記の例を見ると、私はすぐにブリッジパターンを見ると、彼らはすぐにその後、格納しているので、コマンドのパターンを見ますコマンドを呼び出す。

私の質問はこれです。 wikipediaの例では、コマンドパターンを示すためにbridge +コマンドパターンを使用していると思いますか?

EDIT:

私は第二の例を取ると、コマンドの部分を削除した場合、これはブリッジパターンではないでしょうか?

class Light { 
    turnOn() { console.log('turn on') } 
    turnOff() { console.log('turn off') } 
} 

class FlipDownCommand { 
    constructor(light) { 
    this._light = light; 
    } 

    execute() { 
    this._light.turnOff(); 
    } 
} 

class FlipUpCommand { 
    constructor(light) { 
    this._light = light; 
    } 

    execute() { 
    this._light.turnOn(); 
    } 
} 

var light = new Light(); 
var switchUp = new FlipUpCommand(light); 
var switchDown = new FlipDownCommand(light); 

switchUp.execute(); 
switchDown.execute(); 
+0

ブリッジ/コマンドの機能についてはわかりませんが、コマンド例として表示されるJSコードは機能しません。 IIFEがIIFEの外で利用可能な 'carManager'オブジェクトを作成したとしても、それは' .execute() 'メソッドを持っていません。 – nnnnnn

+0

申し訳ありませんが、コードサンプルを正しくコピーしませんでした。それは修正されました。 –

+0

あなたは上記の事例についてあなたが何を正確に混乱させているのか、そしてあなたが知りたいことを明確にすることができますか? – gyre

答えて

1

まず最初は、私は(Wikipediaの定義からも及び)ビットのGoFの本来の解釈は異なるjsの例ではアディOsmaniの解釈を見つけます。

GoFのコマンドパターンのページから:

コマンドパターンは、単一のオブジェクト内に含まれる要求のための情報のすべてを可能にデザインパターンです。このコマンドは、ロールバック機能を備えたキューに入れられたコマンドのバッチの一部として、必要に応じて呼び出すことができます。

これは、コマンドオブジェクトが1つのパラメータなしExecute方法(時にはもUndo)含有すべきであることを意味します。コマンドのパラメータはすでに である必要があります。このコマンドは、呼び出し側に渡され、キューに入れられ、後で実行されます。
Wikipediaの例は、元のGoFと非常によく似ており、その定義に従います。
ブリッジパターンは使用しません。

ブリッジパターンは、抽象化レベルを追加し、サービスの技術的な具体的な実装をコンシューマから隠すために使用されます。 ブリッジは、インターフェイスで定義されているように多くの操作を実行できます。

+0

私が追加した私の3番目の例を見てください。その例をブリッジパターンと見なしますか? –

+1

いいえ、それは依然として呼び出し元がないコマンドパターンです。サービスはどこにあり、どこで抽象化されていますか?あなたはJavaScriptについて話しているので、良いブリッジパターンを作成するのは少し難しいです。 Java/C#のサンプルを見てください。 –

関連する問題