設定ファイルを生成するGUIアプリケーションに取り組んでいます。構成モデルのクラス階層があり、その階層のオブジェクトツリーをいくつかの異なるコンテキストで使用しています。現在、ビジターパターンを使用して、コンテキスト固有のコードでモデルクラスを汚染しないようにしています。
interface IConfigurationElement {
void acceptVisitor(IConfigurationElementVisitor visitor);
}
以前のバージョンinstanceof
では、ビジターの代わりに一連の条件を使用していました。2つのアプローチを比較すると、次のトレードオフが見られます。
ビジター
- 新しいを追加する方が簡単で安全
IConfigurationElement
です。新しい宣言をに追加するだけIConfigurationElementVisitor
で、コンパイラはすべてのビジター実装に対してエラーを生成します。ではinstanceof
チェーンあなたは、新しい構成要素を拡張する必要があるすべての場所を覚えておく必要があります。instanceof
複数の場所でロジックを複製するため、基本的にDRY原則に違反します。 - 訪問者パターンは一連の条件よりも効率的です
instanceof
instanceof
- の大きな利点
instanceof
は、その柔軟性です。たとえば、場合instanceof
によっては同様にIConfigurationElement
処理する必要がある実装のさまざまなサブセットに対して特別なソリューションを定義できます。対照的に、Visitorでは毎回、各実装クラスのメソッドを実装する必要があります。
この種の問題に対する一般的な解決策はありますか?どういうわけかビジターを適応させることができるので、いくつかのケースに共通のソリューションを提供できますか?