導入
テンプレートメソッドは、動作アルゴリズムのスケルトンを定義し、サブクラスにいくつかの手順を遅らせます。テンプレートメソッドにより、サブクラスはアルゴリズムの構造を変更せずにアルゴリズムの特定の特定のステップを再定義できます。
テンプレートメソッドは、コードの再利用の基本的な手法であり、クラスライブラリではクラスライブラリで公開行動を抽出するため、特に重要です。テンプレートメソッドは、伝説的な「ハリウッドの法律」である逆制御構造につながります。つまり、「私たちを探してはいけません。私たちはあなたを探してください」。具体的な症状は、オブジェクト指向のプログラミング言語の抽象クラス(およびそれらの抽象的なメソッド)と、抽象クラス(および抽象的なメソッド)を継承するサブクラスです。
文章
たとえば、紅茶とコーヒーには、沸騰したお湯、醸造、カップに注ぐ、小さな材料を追加するなど、同じステップがあります。ただし、各飲料と追加の小さな材料を醸造する方法は異なるため、テンプレート方法を使用してこの主なステップを達成できます。
まず、抽象的な手順を定義します。
コードコピーは次のとおりです。
var caffeinebeverage = function(){
};
caffeinebeverage.prototype.preparerecipe = function(){
this.boilwater();
this.brew();
this.pouroncup();
if(this.customerwantscondiments()){
//小さな材料を追加できる場合は、追加してください
this.addcondiments();
}
};
caffeinebeverage.prototype.boilwater = function(){
console.log( "水を沸騰させてください!");
};
caffeinebeverage.prototype.pouroncup = function(){
console.log( "飲み物をカップに入れてください!");
};
caffeinebeverage.prototype.brew = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
};
caffeinebeverage.prototype.addcondiments = function(){
新しいエラーをスローします(「この方法は書き直す必要があります!」);
};
//デフォルトで小さな資料を追加します
caffeinebeverage.prototype.customerwantscondiments = function(){
trueを返します。
};
この関数は、プロトタイプのすべての基本的な手順と主な手順を拡張します。醸造と少量の材料の追加は実装されておらず、実装する特定の飲料に対応する関数によって使用されます。さらに、小さな成分を追加するかどうか(customerwantscondintiments)は、デフォルトでtrueを返します。この値は、サブ機能を書き直すときに書き直すことができます。
次の2つの機能は、醸造コーヒーと醸造ティーの対応する機能です。
コードコピーは次のとおりです。
//コーヒーを作る
var Coffee = function(){
caffeinebeverage.apply(this);
};
collet.prototype = new CaffeineBeverage();
collef.prototype.brew = function(){
console.log( "コーヒーメーカーからコーヒーを注ぎたい!");
};
collet.prototype.addcondiments = function(){
console.log( "砂糖と牛乳の追加");
};
collet.prototype.customerwantscondiments = function(){
確認確認(「砂糖と牛乳を加えたいですか?」);
};
//茶葉を作ります
var tea = function(){
caffeinebeverage.apply(this);
};
tea.prototype = new caffeinebeverage();
tea.prototype.brew = function(){
console.log("Puuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
};
tea.prototype.addcondiments = function(){
console.log( "add lemon!");
};
tea.prototype.customerwantscondiments = function(){
確認確認(「レモンを追加しますか?」);
};
さらに、確認により、ユーザーは自分で小さな材料を追加するかどうかを選択できますが、これは非常に良いことではありませんか?
要約します
テンプレートメソッドは、次の状況に適用されます。
1.一度にアルゴリズムの不変の部分を実装し、可変行動をサブクラスに残して実装する
2。各サブクラスの公共の行動は、コードの複製を避けるために、パブリック親クラスに抽出および集中する必要があり、違いは新しい操作に分けられます。最後に、これらの異なるコードをこれらの新しい操作をフィッシングするためのテンプレート方法に置き換えます。
3。サブクラス拡張機能を制御します。テンプレートメソッドは、特定のポイントでの「フック」操作のみを呼び出すため、これらのポイントで拡張機能を許可します。
ポリシーパターンとは異なり、テンプレートメソッドは継承を使用してアルゴリズムの一部を変更しますが、ポリシーパターンはデリゲートを使用してアルゴリズム全体を変更します。