導入
デコレーターは、継承よりも柔軟な代替品を提供します。デコレーターは、同じインターフェイスをラップするために使用されるオブジェクトを使用します。これにより、動作をメソッドに追加できるだけでなく、メソッドを元のオブジェクト呼び出し(デコレーターのコンストラクターなど)に設定します。
デコレーターは、過負荷の方法の形を介して新しい機能を追加するために使用されます。このモードは、特定の目的を達成するために、デコレータの前または後に独自の動作を追加できます。
文章
では、デコレーターモードの利点は何ですか?前述のように、デコレーターは相続を達成するための代替手段です。スクリプトが実行されているとき、サブクラスに動作を追加すると、元のクラスのすべてのインスタンスに影響しますが、デコレーターはそうではありません。代わりに、異なるオブジェクトに新しい動作を追加できます。次のコードは次のようになります。
コードコピーは次のとおりです。
//装飾(機能)が必要なクラス(関数)
function macbook(){
this.cost = function(){
1000を返します。
};
}
関数メモリ(MacBook){
this.cost = function(){
macbook.cost() + 75を返します。
};
}
関数BlurayDrive(MacBook){
this.cost = function(){
macbook.cost() + 300を返します。
};
}
function Insurance(macbook){
this.cost = function(){
macbook.cost() + 250を返します。
};
}
// 使用法
var mymacbook = new Insurance(new bluraydrive(new Memory(new Macbook())));
console.log(mymacbook.cost());
以下は別の例です。 DecoratorオブジェクトのPerformTaskを呼び出すと、デコレーターの動作があるだけでなく、下部オブジェクトのパフォーマンス関数も呼び出します。
コードコピーは次のとおりです。
関数concreteclass(){
this.performtask = function(){
this.pretask();
console.log( '何かをする');
this.posttask();
};
}
関数AbstractDecorator(装飾){
this.performtask = function(){
decorated.performtask();
};
}
関数concretedecoratorclass(装飾){
this.base = abstractDecorator;
this.base(装飾);
dorated.pretask = function(){
console.log( 'pre-calling ..');
};
decorated.posttask = function(){
console.log( 'ポストコール..');
};
}
var concrete = new ConcreTeClass();
var decorator1 = new ConcretedecoratorClass(コンクリート);
var decorator2 = new ConcretedecoratorClass(Decorator1);
decorator2.performtask();
別の例を挙げましょう:
コードコピーは次のとおりです。
var tree = {};
tree.decorate = function(){
console.log( 'ツリーが勝つ/' t fall 'を確認してください);
};
tree.getDecorator = function(deco){
tree [deco] .prototype = this;
新しいツリー[deco]を返します。
};
tree.redballs = function(){
this.decorate = function(){
this.redballs.prototype.decorate(); //ステップ7:プロトタイプ(これは天使です)飾る方法を最初に実行する
console.log( 'いくつかの赤いボールを着用する'); //ステップ8出力赤
//これらの2つのステップをレッドボールの装飾方法として使用します
}
};
tree.blueballs = function(){
this.decorate = function(){
this.blueballs.prototype.decorate(); //ステップ1:プロトタイプの飾り方を最初に実行します。つまり、tree.decorate()
console.log( 'Blue Balls'を追加); //ステップ2出力青
//ブルーボールがメソッドを飾るので、これら2つのステップを使用してください
}
};
tree.angel = function(){
this.decorate = function(){
this.angel.prototype.decorate(); //ステップ4:プロトタイプ(これはブルーボール)飾り方を最初に実行する
console.log( '上部の天使'); //ステップ5出力天使
//これらの2つのステップをエンジェルの装飾方法として使用します
}
};
tree = tree.getDecorator( 'Blueballs'); //ステップ3:Blueballsオブジェクトをツリーに割り当てると、親プロトタイプのGetDecoratorがまだ利用可能です
tree = tree.getDecorator( 'Angel'); //ステップ6:天使オブジェクトをツリーに割り当てます。現時点では、親プロトタイプの親プロトタイプのGetDecoratorはまだ利用可能です
tree = tree.getDecorator( 'redballs'); //ステップ9:Redballsオブジェクトをツリーに割り当てます
tree.decorate(); //ステップ10:Redballsオブジェクトの飾り方を実行する
要約します
デコレーターパターンは、既存の関数にさらに関数を動的に追加する方法です。装飾される各関数は別の関数に配置され、この関数を使用して既存の関数オブジェクトをラップして装飾します。したがって、特別な動作を実行する必要がある場合、呼び出しコードは、必要に応じてオブジェクトをラップするために装飾機能を選択的かつ順次使用できます。利点は、クラス(関数)の中核的な責任を装飾機能と区別することです。