重要な登場人物
- Element
- データ構造の各要素を表すクラス。ファイルに当たるもの。
- ObjectStructure
- Elementの集合を扱うクラス。ディレクトリに当たるもの。
- Visitor
- データ構造の各要素を利用した処理の実装。ElementとObjectStructureに対して行う処理を実装する。
Visitorパターンでは、データ構造の階層の深さを意識することなく、またデータ構造側にデータ処理を一切書くことなく走査を行うことができる。データ走査は、Visitorをroot要素に渡すだけ。あとは勝手にデータ構造を舐め回して各Element(i.e ファイル)へ到達してくれる。
Visitorの実装
各要素に対して処理を行うためのAPIのみを定義した抽象クラスを定義する。
abstract void visit(ObjectStructure aDir); abstract void visit(Element aFile);
具体的な処理内容に依ってVisitorの継承クラスを実装する。例えば処理内容が「ファイルの名前一覧を作成する」であった場合、FilenameVisitorクラスを作成して、次のような実装を行う。
/** * ディレクトリに対して行う処理を定義。 * @param aDir ObjectStructure */ public void visit(ObjectStructure aDir) { for (Element each : aDir.children()) { each.accept(this); } } /** * ファイルに対して行う処理を定義。 * @param aFile Element */ public void visit(Element aFile) { logger.print(aFile.getName()); }
ObjectStructureの実装
Elementの集合を扱うクラスであり、以下のような実装になる。データ処理に関する実装は一切必要ないところがポイント。
/** * 子要素のリストを取得する。 * @return 子要素リスト */ public List<Element> children() { return this.children; } /** * データ処理インターフェースの受け口。 * @param aVisitor Visitor */ public void accept(Visitor aVisitor) { aVisitor.visit(this); }
Elementの実装
最小の要素を示すクラスであり、以下のような実装になる。これもデータ処理に関する実装は一切必要ない。
/** * 名前を取得する。 * @return 名前 */ public String getName() { return this.name; } /** * データ処理インターフェースの受け口。 * @param aVisitor Visitor */ public void accpt(Visitor aVisitor) { aVisitor.visit(this); }
0 件のコメント:
コメントを投稿