Wicket Code Reading - PageMapでVisitorパターン

最近は暇をみつけて、Wicketのソースを読んだりしてる。
最近追ってるのは org.apache.wicket.PageMapクラス。
ページ情報をバージョン管理しつつ格納するクラス。

今まで業務ではあまり見なかったVisitorパターンらしき物を発見したので、
Visitorパターンを勉強してみた。
Visitorパターンとは、操作とデータを分離するパターンで、名前だけは知ってたけど、
今までお目にかかることはなかった。

該当のコードをまとめると以下のようになる。
public abstract class PageMap {
    public void clear (){
	visitEntries(new IVisitor() {
 		public void entry(IPageMapEntry entry) {
		    removeEntry(entry);
		}
 	    });
    }

    public abstract void removeEntry(final IPageMapEntry entry);

    static interface IVisitor {
	void entry(IPageMapEntry visitor);
    }

    public void visitEntries(IVisitor visitor) {
	IPageMapEntry pageMapEntry = new Entry1();
	visitor.entry(pageMapEntry);
    } 
}

class PageMapImp1 extends PageMap {
    public void removeEntry(final IPageMapEntry entry) {
	System.out.println("VisitorSampleImp1#visit is called");
    }
}
 interface IPageMapEntry {}

 class Entry1 implements IPageMapEntry {
 }
通常のVisitorパターンと違う所はIVisiterの実装が無名クラスで定義されている。
あと、visitEntriesメソッドがVisitorパターンで言うAccepterクラスを代用している。

ここまでわかって、純粋なVisitorパターンではなさそうな気がしてきた。
ポイントはIVisitorのentryメソッド。
ここで引数がInterfaceになっている。自分が知っている限り、VisitorパターンではVisitor側のメソッドでは、
引数をInterfaceでなく、実装となるはず。
つまりデータに対する処理がInterfaceに依存してしまう事になる。

と言うことで、Interface名に惑わされたけど、これは純粋なVisitorパターンではなさそう。
Visitorパターンのいい勉強にはなったけど。


Comment