プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

13.Visitor 構造を渡り歩きながら仕事をする

データ構造と処理を分離

f:id:p-monster:20121218195555p:plain

Visitor・・・コンテナの要素ごとに処理を行うメソッドを宣言
ConcreteVisitor・・・Visitorの実装。
Element・・・Visitorの訪問先。訪問者を受け入れるメソッドを宣言
ConcreteElement・・・Elementの実装
ObjectStructure・・・Elemntのコンテナ

見た目は複雑に見えるが、データ構造から処理を分離できる。
構造はそのままに新しいVisitorを作成するだけで別の処理を行うことができる。

クラスは拡張できるようにするべきだが、既存クラスを修正しなければ拡張できない構造にはするべきではない。
拡張については開かれており、修正については閉じられているようなクラス=再利用性が高いクラス

  • 拡張については開き、修正については閉じる。
  • 既存のクラスを修正せずに拡張できるようにする。

具体的には機能を拡張する際に「新しいクラスを宣言して、そのインスタンスをどこかに渡すだけで機能を追加できる」とか。

関連しているパターン

Iterator・・・IteratorもVisitorもあるデータ構造の上で処理を行う。Iteratorは要素を1つ1つ得るのに使う。Visitorは要素に特定の処理をほどこす。
Composite・・・訪問先はCompositeかも知れない
Interpreter・・・Visitorが使われる場合がある。例えば構文木を作った後、構文木の各ノードを巡回しながら処理を行う時

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門