Categories
デザインパターン

Visiter パターン

概要

訪問者パターン(Visitor Pattern)は、ソフトウェア設計パターンの一つです。このパターンは、オブジェクトの構造と操作を分離することで、新しい操作を追加する際の柔軟性と拡張性を提供します。訪問者パターンでは、データ構造を表すクラスとデータ構造上の要素を表すクラスの間に相互依存関係がないようにします。

訪問者パターンには以下の要素が関与します:

  1. 訪問者(Visitor):新しい操作を表すためのインターフェースを定義します。訪問者インターフェースには、データ構造内の各要素を訪れるメソッドが含まれます。このメソッドは、要素の型ごとにオーバーロードされます。
  2. 要素(Element):訪問者が訪れるオブジェクトを表します。要素は、訪問者に自身を受け入れる(accept)メソッドを提供します。このメソッドは、訪問者に対して自身を引数として渡します。
  3. 具体訪問者(Concrete Visitor):訪問者インターフェースを実装し、具体的な操作の実装を提供します。具体訪問者は、要素の種類ごとに異なる操作を実行することができます。
  4. 具体要素(Concrete Element):要素インターフェースを実装し、自身を受け入れるメソッドの実装を提供します。具体要素は、訪問者が実行する操作の対象となります。

訪問者パターンでは、要素クラスの階層と訪問者クラスの階層が別々に拡張されるため、新しい操作の追加が容易になります。また、処理の分離により、要素クラスの変更を伴わずに新しい操作を追加できるメリットもあります。

訪問者パターンは、以下のような状況で使用されます:

  • オブジェクトの構造と操作を分離し、新しい操作を容易に追加したい場合。
  • オブジェクトの構造は安定しており、操作の追加が頻繁に行われる場合。
  • オブジェクトの構造と操作は異なる利用者によって異なる頻度で変更される場合。

訪問者パターンにより、データ構造と操作の間の依存関係を解消し、柔軟性と拡張性を向上させることができます。

コード例

以下は、C++での訪問者パターンのコード例です。この例では、異なる要素(Element)に対して訪問者(Visitor)が異なる操作を実行するシナリオを考えます。

 このコードでは、Elementクラスが要素の基底クラスを表しています。ConcreteElementAとConcreteElementBクラスは具体要素を表し、それぞれoperationAとoperationBという独自の操作を持ちます。Visitorクラスが訪問者の基底クラスを表し、ConcreteVisitor1とConcreteVisitor2クラスが具体訪問者を表しています。それぞれの具体訪問者は、visitメソッドをオーバーライドして要素ごとの操作を実行します。

 main関数では、要素のコレクションを作成し、具体訪問者1を適用して要素ごとの操作を実行します。その後、具体訪問者2を適用して異なる操作を実行します。訪問者パターンにより、要素と操作が分離され、新しい操作の追加や変更が容易になります。また、要素のクラス階層に変更を加えずに新しい操作を追加できる柔軟性も提供します。