Wicket Code Reading - PageMapでVisitorパターン

2007–11–18

最近は暇をみつけて、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パターンのいい勉強にはなったけど。