多くの欠点がなく、ビジター機能をエミュレートするためのクリーンなデザインを探しています。Java では、従来の実装 (GoF で説明されているように) は、if-else を取り除くために二重ディスパッチに頼っています。これを解決するために、リフレクションを使用して「Visitable」クラスの変更を回避する実装を見てきましたが、これらはメソッド名を探すときにハードコードされた文字列に依存しています。非常に便利ですが、それでもきれいなデザインではないと思います。
データ構造や優れた OO 設計を使用して同じアイデアをエミュレートすることは可能ですか? パターンである必要はありません。同様の問題が解決される例を探しているだけです (例: a を使用Map<Class<T>,SomeFunctionObject>
)。
更新次のようなもの:
public abstract class BaseVisitor<T> {
private final TypesafeHeterogeneusMap map;
protected BaseVisitor(){
map = inflateFunctions();
}
public <E extends T> void process(E element){
if(element == null){
throw new NullPointerException();
}
boolean processed = false;
@SuppressWarnings("unchecked")
Class<? super T> sc = (Class<? super T>) element.getClass();
while(true){
if(sc != null){
FunctionObject<? super T> fo2 = map.get(sc);
if(fo2 != null){
fo2.process(element);
processed = true;
break;
}
sc = sc.getSuperclass();
} else {
break;
}
}
if(!processed) System.out.println("Unknown type: " + element.getClass().getName());
}
abstract TypesafeHeterogeneusMap inflateFunctions();
}
実際には、テンプレート パターンとコマンド パターンが混在していると思います。それを強化する方法についての提案を自由に投稿してください。