Visitor(ちょうぜつ本)
構造のスキャン
未知の操作に対する拡張性を得たい
スキャン操作のパラメータとして、各要素が任意の振る舞いを持った訪問者オブジェクトを受け入れられるようにして (Kindle版 p.426)
要素は訪問者を受け入れるだけ(acceptメソッドがvisitorを受け入れる)
訪問者に要素の操作をしてもらう
利用者はトップレベルのメソッドをひとつ呼ぶだけで、その構造の詳細に踏み込むことなく、各要素に対して任意の操作を実現 (Kindle版 p.427)
IteratorかVisitorか(リスト8-61)
イテレータは構造に対する繰り返し方をあらかじめ知っている必要がある
過去にSphinx拡張で特定のheadingだけ繰り返す実装をした
-> これはVisitorでも書けた!
Visitorは関数を適用するイメージ(組み込みのmap)
visitorインスタンスが要素を操作してくれる(この要素にはこうする)
Sphinx拡張!(Translator)
操作対象が操作の詳細を決められないとき、Visitor を受け入れられるようにだけしておけば、操作の詳細を除いて先に安定させてしまえる、というのがこのパターンです。
やりたいことの詳細は後から別のパッケージで作ってもらう
Visitorの例がサンタクロース
煙突がvisitorをaccept
適用される対象から見れば、Visitor がどこに住んでいるのかは知らないけれど、どこからともなくメソッドの引数としてやってきてうまくやってくれ、return 後は靴下にプレゼントが入っているだけ。
[1, 2, 3].map(function(n){ return n + 1; })