質問

アプリケーション開発の時点でファサードパターンが必要であることをどのようにして知ることができますか?

ファサードパターンとテンプレートパターンの間にラインを描くにはどうすればよいですか?

例:in これ 記事、私たちはそれを見る、 int placeOrder(int CustomerID, List<BasketItem> Products) アルゴリズムにいくつかの事前定義されたステップがあります。では、なぜ著者はここでテンプレートパターンを使用しないのですか?

役に立ちましたか?

解決

ファサードは、実装ではなくインターフェイスを扱います。その目的は、外側で単純に見える単一のインターフェイスの後ろに内部の複雑さを隠すことです。質問の例では、ファサードは、単一の方法の背後に4つのクラス(注文、注文、アドレス、バスケット項目)を隠しています。

テンプレートメソッドは実装を扱います。その目的は、「ブランクの入力」の方法でのみ異なるいくつかのアルゴリズムから共通のアルゴリズムを抽出することです。スーパークラスのテンプレートメソッドは、共通のアルゴリズムを実装し、各サブクラスは独自の特定の方法で「ブランクに入力」します。

では、なぜ著者はここでテンプレートパターンを使用しないのですか?

作るのは理にかなっています placeOrder 操作にいくつかの同様のバージョンがある場合のテンプレートメソッド。たぶんいくつかの方法があります placePhoneOrder, placeInternetOrder, placeManuallyEnteredOrder 単一のテンプレートにリファクタリングすることができます placeOrder 一部のサブクラスは、{電話、インターネット、マニュアル}特異的な違いのみを実装しています。

他のヒント

ファサードパターンは、単純化された方法でクライアントに公開する複雑なシステムがある場合、またはシステムと互換性のない既存のシステム上に外部通信レイヤーを作成する場合に適しています。それは 構造 パターン。ここを参照してください: http://en.wikipedia.org/wiki/facade_pattern

一方、テンプレートパターンは 行動 コンポーネントの内部実装を扱うときに役立つパターン。ここを参照してください: http://en.wikipedia.org/wiki/template_method_pattern

いくつかのサービス、図書館などがあるとします。これらのライブラリは、いくつかのより高いレベルのサービスを実行するために相互操作が必要です。次に、通常、一緒に行くコールとintializationコードをラップし、これらの詳細を隠し、特定のシナリオにそれらのサービスを簡単に使用できるようにするための機能を提供します。その後、ファサードパターンに適しています。

更新:記事では、PlaceOrderメソッドには、すべての注文に合わせて機能する1つの実装があります。テンプレートパターンは、従わなければならない一連のステップを処方することを目的としていますが、サブクラスがこれらの固定ステップのカスタム実装を提供できるようにします。たとえば、テレビの注文を電子レンジの注文とは異なる方法で処理する必要がある場合は、テンプレートパターンを使用して、想像上のDispatchParcelメソッドを再定義することができます(単純なパッケージとして電子レンジを送信するが、重いデバイスを追加するための特別なサービスでテレビを送信することができます。上の階)。私たちの場合、プロセスオーダー手順を再実装する必要はないため、1つの実装があらゆる種類の注文に適しているため、テンプレートパターンは必要ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top