28

Visitor パターンに関するすべてのドキュメントを読みましたが、まだかなり混乱しています。この例を別のSOの質問から引用しました。誰かが私を理解するのを手伝ってくれますか? たとえば、いつビジター デザイン パターンを使用するのでしょうか。ある程度は理解できたと思いますが、全体像を把握できていません。いつ使用できるかを知るにはどうすればよいですか?

class equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor) = 0;
}

class floppyDisk : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class processor : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class computer : public equipmentVisited
{
  virtual void accept(equipmentVisitor* visitor);
}

class equipmentVisitor
{
  virtual void visitFloppyDisk(floppyDisk* );
  virtual void visitProcessor(processor* );
  virtual void visitComputer(computer* );
}

// Some additional classes inheriting from equipmentVisitor would be here

equipmentVisited* visited;
equipmentVisitor* visitor;

// Here you initialise visited and visitor in any convenient way

visited->accept(visitor);
4

2 に答える 2

38

ビジターパターンは、ダブルディスパッチを実装するために使用されます。簡単に言うと、実行されるコードは2つのオブジェクトのランタイムタイプに依存することを意味します。

通常の仮想関数を呼び出す場合、それは単一のディスパッチです。実行されるコードは、単一のオブジェクトの実行時型、つまり、呼び出す仮想メソッドの実行時型によって異なります。

ビジターパターンでは、呼び出されるメソッドは、最終的に2つのオブジェクトのタイプ(を実装するオブジェクトequipmentVisitorのタイプと、呼び出すオブジェクトaccept(つまり、equipmentVisitedサブクラス)のタイプ)に依存します。

C++でダブルディスパッチを実装する方法は他にもあります。ScottMeyerの「MoreEffectiveC++」の項目31は、この主題を詳細に扱っています。

于 2012-04-12T01:10:12.273 に答える