私はビジター パターンに少し慣れていませんが、ビジターの実装が必要なタスクがあります ("instanceof" チェックを回避したい場合)。
ラベル、パネル、ウィジェット(チェックボックス、リストボックス、テキストボックスなど)のいくつかのgwt要素のラッパーであるクラスがあります。UI の類似部分のコレクションとして配列を使用します。例: ラベル + チェックボックス、ラベル + テキスト ボックス。ラベル+ボタン等
一部の要素は異なる方法で構築されます (たとえば、Panel から派生した別のクラスの一部)。その結果、同じコンストラクターが 2 つありますが、オーバーロードされたメソッドが 1 か所で使用されています。これらのコンストラクターをマージし、前述のメソッド内で「instanceof」を使用して要素をチェックできます。しかし、私はこの解決策が嫌いで、訪問者パターンを使用して置き換えたいと考えています。実を言うと、私はそれを行う方法がわかりません。あなたの助けを願っています。
これが私が持っているものの例です:
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
このようなもの(私はそれを最大限に抽象化しようとしましたが、実際にはもっと難しいです)。
したがって、「instanceof」を使用したソリューションがあります。
private initPanel(Object object, Widget widget) {
if(object instanceof String) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
if(object instanceof ConstructedClass) {
panel = SomeStaticUtilityClass.initPanelFromObject(cs, widget);
}
}
「instanceof」から保存され、コンストラクターを 1 つだけ残し、可能であれば、オーバーロードされたバージョンのない init メソッドを 1 つ残したいと考えています。ご提案、ご協力ありがとうございます。
PS> 繰り返しますが、上記のクラスは偽造されており、特にこの String ラベルでは誤解が生じているようです :)