2010年6月20日日曜日

Visitorパターン

Visitorとは訪問者のことで、Visitorパターンとはデータ構造の中を訪問して処理を行うパターンです。

プログラムの説明を全部すると莫大な量の文章を書かなくてはならないので今回は割愛サーセン(´・ω・`)


Visitorは、各データを訪問するvisitorメソッドを用意します。以前勉強したCompositeパターンで言うと、Fileクラスを訪ねるvisitorメソッドとDirectoryクラスを訪ねるvisitorメソッドを用意することになります。

public void visit(File file) {
    ・・・
}

public void visit(Directori dir) {
    ・・・
}
ちなみに、訪問時の処理が複数考えられるならば、処理ごとにクラスを切り出します。上記のコードをabstractなVistorクラスとして書いておいて、そのクラスを継承したクラスを作ればいいです。

また、訪問される側(つまり、データ側)は訪問を受け入れなければなりません。ということで、acceptメソッドを用意します。引数は訪問してきた人、つまり、Visitorクラスのインスタンスです。
public void accept(Visitor v) {
    v.accept(this);
}
内部では、訪ねてきた人に処理をお願いします。渡すのは自身です。ということで、(Compositeパターンの例で言うと)Fileだったり、Directoryだったりします。本には書かれていないのですが、もし何かしらの理由で受け入れできない場合はここで例外を出すのが良いと思います。

Mainでは、データを用意してVisitorに訪問してもらいましょう。
・・・
File file = new File("sample", 100);
file.accept(new SampleVisitor());
・・・

このパターンを使う理由としてはデータと処理の分離をするためです。
処理の追加はVisitorクラスを継承したクラスを作ればよいので容易です。しかし、データを拡張した場合は、Visitorクラスにそのデータに訪問するvisitメソッドを(Visitorクラスのサブクラス全て)書かないといけないので、大変です。

関連パターン
Iteratorパターン」データ構造を辿って処理するパターンのもうひとつの例
Compositeパターン」Visitorパターンを適用するデータ構造はCompositeパターンになることがある。
「Interpreterパターン」(勉強中)

0 件のコメント:

コメントを投稿