プログラムの説明を全部すると莫大な量の文章を書かなくてはならないので今回は割愛サーセン(´・ω・`)
Visitorは、各データを訪問するvisitorメソッドを用意します。以前勉強したCompositeパターンで言うと、Fileクラスを訪ねるvisitorメソッドとDirectoryクラスを訪ねるvisitorメソッドを用意することになります。
- public void visit(File file) {
- ・・・
- }
- public void visit(Directori dir) {
- ・・・
- }
また、訪問される側(つまり、データ側)は訪問を受け入れなければなりません。ということで、acceptメソッドを用意します。引数は訪問してきた人、つまり、Visitorクラスのインスタンスです。
- public void accept(Visitor v) {
- v.accept(this);
- }
Mainでは、データを用意してVisitorに訪問してもらいましょう。
- ・・・
- File file = new File("sample", 100);
- file.accept(new SampleVisitor());
- ・・・
このパターンを使う理由としてはデータと処理の分離をするためです。
処理の追加はVisitorクラスを継承したクラスを作ればよいので容易です。しかし、データを拡張した場合は、Visitorクラスにそのデータに訪問するvisitメソッドを(Visitorクラスのサブクラス全て)書かないといけないので、大変です。
関連パターン
「Iteratorパターン」データ構造を辿って処理するパターンのもうひとつの例
「Compositeパターン」Visitorパターンを適用するデータ構造はCompositeパターンになることがある。
「Interpreterパターン」(勉強中)
0 件のコメント:
コメントを投稿