重要な登場人物
- 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 件のコメント:
コメントを投稿