私はイテレータとビジターの両方をよく知っていて、頻繁に使用しており、Gang of Four のデザイン パターンについて聞く前から両方を使用していました。2 つのパターンの構文はかなり異なりますが、オブジェクトのグループをトラバースするという同じ概念上の目標のために両方を使用します。大まかに言えば、同じ型の非構造化オブジェクトがある場合は反復子を使用し、異なる型の構造化オブジェクトがある場合はビジターを使用します。私にとって、ビジターはエレガントで派手な、より強力な型付けイテレーターにすぎません。
デザイン パターンを読んだとき、ビジターの説明、特にイテレータの説明との違いに気付きました。
ビジターを使用すると、操作対象の要素のクラスを変更せずに新しい操作を定義できます
イテレーター: 基になる表現を公開せずに、集約オブジェクトの要素に順番にアクセスする方法を提供します。
それ以来、私はそれについて考えてきましたが、訪問者が新しい操作をどのように定義するかを実際には理解できません。
たとえばtoLocalizedString()
、のローカライズされた代替手段として、かなり単純な操作を実装したい場合toString()
。ビジターを要素に渡すと、そのオブジェクトのサブ構造全体をトラバースします。さらに、accept/visit メソッドからは何も返すことができません。これらの各特性により、私はビジターを使用して を定義することができませんtoLocalizedString()
。
そして、これは私の質問をもたらします:イテレータがしない方法で、ビジターはどのように「新しい操作を定義する」のでしょうか? ギャング オブ フォーの説明を信じるなら、ビジター パターンの真の力を見逃しているように感じます。