次のクラス構造があるとします。
ページ
、およびインターフェイスは、クライアントによって実装されますPage
。これらは、ページ タイプ (静的または動的) に応じてさまざまなデータを提供し、. これらのインターフェースには多くの実装があるかもしれません。StaticPage
DynamicPage
Renderer
レンダラー
はRenderer
ページをレンダリングします。また、このインターフェースには複数の実装が存在する場合があります (さまざまなレンダリング手法用)。
レンダーマネージャー
これは、指定されたページ タイプに応じて、提供されたレンダラーで適切な render メソッドを呼び出すことになっている単なるファサードです。そして、ここにあります
問題
Renderer
提供されたページの種類に応じて、オブジェクトで呼び出すメソッドを決定する方法は?
現在の (不十分な) 解決策
現在、条件を使用してディスパッチしています:
void render(Page page, Renderer renderer) {
if (page is StaticPage) {
renderer.renderStaticPage(page);
} else if (page is DynamicPage) {
renderer.renderDynamicPage(page);
} else {
throw new Exception("page type not supported");
}
}
どうしたの
このソリューションの問題点は、別のページ タイプを追加する (つまり、Page
インターフェイスを拡張する) 場合は常に、このメソッドも調整する必要があることです。実際、これはオブジェクト指向言語のポリモーフィック(仮想) メソッドが使用されると想定されているものですが、この場合、これは機能しません (以下の理由を参照)。
検討したが却下したその他の解決策
interface の代わりに抽象クラス。これにより、実装者の型階層に不必要な制約が課されます。実装者は、必要なクラスを拡張できなくなり、代わりに抽象
StaticPage
またはDynamicPage
クラスを拡張することを余儀なくされます。これは最悪です。インターフェイスにメソッドを追加
dispatch(Renderer render)
し、ページ タイプに応じてレンダラー オブジェクトで適切なメソッドを呼び出すように実装者に強制します。実装者はレンダリングを気にするべきではないため、これは明らかにひどいものです。レンダリングするデータを提供するだけでよいのです。
では、この状況で役立つパターンや代替設計があるのではないでしょうか? どんなアイデアでも大歓迎です。:)