一。コマンドパターン
コマンドパターンは、メソッド呼び出しの詳細をカプセル化し、リクエスターとエグゼキューターを非結合します
(黯羽轻扬:デザインパターン之コマンドパターン(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
このような実装は非常に簡潔です(私たちのコマンドパターンは 1 行のコードのみ)。クラシック実装で型を制約するために使用される余計な抽象を模擬する必要はありません
四。コマンドパターンとファサードパターン
���く考えてみると、これはファサードパターンと同じではありませんか。どちらも既存のインターフェースをカプセル化します。確かに非常に似ていますが、唯一の違いはコマンドパターンが統一入口の提供(制御を加える)に重点を置いているのに対し、ファサードパターンはインターフェースをより使いやすくするために既存のインターフェースを二次カプセル化することです(必ずしも統一した 1 つの入口を提供する必要はなく、一組の新しいインターフェースを提供することも完全に可能です)
このように理解できます。ファサードが提供するインターフェースが 1 つだけの場合、それがコマンドパターンになります。既存のインターフェースをカプセル化した後に提供する新しいインターフェースの数が二者を区別する鍵です。コマンドパターンは 1 つだけ(例中の exec)しか持てず、ファサードパターンには制限がなく、新しいインターフェースが元のインターフェースより使いやすければ良いだけです
参考資料
- 《JavaScript デザインパターン》
コメントはまだありません