Wicket Code Reading - PageMapでVisitorパターン
最近は暇をみつけて、Wicketのソースを読んだりしてる。
最近追ってるのは org.apache.wicket.PageMapクラス。
ページ情報をバージョン管理しつつ格納するクラス。
今まで業務ではあまり見なかったVisitorパターンらしき物を発見したので、
Visitorパターンを勉強してみた。
Visitorパターンとは、操作とデータを分離するパターンで、名前だけは知ってたけど、
今までお目にかかることはなかった。
該当のコードをまとめると以下のようになる。
あと、visitEntriesメソッドがVisitorパターンで言うAccepterクラスを代用している。
ここまでわかって、純粋なVisitorパターンではなさそうな気がしてきた。
ポイントはIVisitorのentryメソッド。
ここで引数がInterfaceになっている。自分が知っている限り、VisitorパターンではVisitor側のメソッドでは、
引数をInterfaceでなく、実装となるはず。
つまりデータに対する処理がInterfaceに依存してしまう事になる。
と言うことで、Interface名に惑わされたけど、これは純粋なVisitorパターンではなさそう。
Visitorパターンのいい勉強にはなったけど。
最近追ってるのは 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パターンのいい勉強にはなったけど。