JavaScriptのテンプレートメソッド
-
28-09-2019 - |
質問
JavaScriptでは、テンプレートメソッドパターンを実装したいと思います。
いくつかのサブクラスを備えたPropertyDecoratorがあります:openbuttondecorator、Seebuttondecoratorなど。プロパティデコレーターに次の関数を持ちたい:
var build = function(){
decorate(); //Abstract in PropertyDecorator, defined in subclasses
return le.build();
}
このシナリオを機能させるにはどうすればよいですか?たぶん私は間違った継承を実装しました:S(それも助けてください:))
前もって感謝します。
解決
JavaScriptは、動的な型付けられたプロトタイプベースの言語です。テンプレートメソッドは設計パターンであり、したがって言語に依存しないものですが、その実装は言語間で異なる場合があります。
JavaScriptの場合、およびRubyなどの他の動的にタイプされた言語では、抽象クラスやインターフェイスはあまり意味がありません。これは、委任を介して動的リンクが発生するためです。 (メソッド呼び出しは、プロトタイプがリクエストを処理できるまで、継承ツリーのより高いレベルに伝播されます)。これは、アヒルタイピングと併せて、任意の方法を任意のインスタンスで呼び出す潜在的な潜在的な契約の必要性を回避することを意味します。これは、クラスベースの言語では、特定のタイプで見える宣言された方法によって定義されます。
したがって、パターンを実装するには、親のプロトタイプビルドメソッド(その方法はテンプレートになります)で存在しないメソッドを呼び出し、そのメソッドをsublcassesに実装するだけです。
function PropertyDecorator()
{
this.build = function()
{
var decoration=this.decorate();
return "The decoration I did: "+decoration;
};
}
//we set the parent (those prototype that instances of this class will delegate calls to)
OpenButtonDecorator.prototype = new PropertyDecorator();
function OpenButtonDecorator()
{
this.decorate = function()
{
return "open button";
};
}
SeeButtonDecorator.prototype = new PropertyDecorator();
function SeeButtonDecorator()
{
this.decorate = function()
{
return "see button";
};
}
var decorators=Array(new SeeButtonDecorator(),new OpenButtonDecorator());
for (var decorator in decorators){
document.writeln(decorators[decorator].build());
}
この方法でメソッドディスパッチが発生します。
- インスタンスにはメソッドが呼び出されましたか?
- いいえ - >親への委任(それはプロトタイプ)を繰り返します。
- はい - >暗黙のオブジェクトのコンテキストでメソッド本体(最初に呼び出しを受けたもの)を実行します。
したがって、新しいSeebuttondecorator()。build()を呼び出すと、最初に、インスタンスでbuildメソッドを実行しようとします。インスタンスでは定義されていないため、メソッドの呼び出しはインスタンスの親に委任されます。この場合、この場合、これはメソッドもありません。 PropertyDecorator、 build()
方法。
function PropertyDecorator()
{
this.build = function()
{
var decoration=this.decorate();
return "The decoration I did: "+decoration;
};
}
それを実行するとき、 build
メソッドの本体は、新しいSeeButtondeCorator()のコンテキストで評価されます。インスタンス自体にはありません decorate()
メソッドは、SeebuttondeCorator()関数(そのプロトタイプ)で定義されています。さて、今回はコールがインスタンスプロトタイプに委任されます。
function SeeButtonDecorator()
{
this.decorate = function()
{
return "see button";
};
}
メソッドはインスタンスのコンテキストで再度実行され、文字列を返し、戻るまでコールスタックに戻ります
The decoration I did: see button