• ベストアンサー

Visiorパターン

デザインパターンのVisiorパターンにて、 visitする順番を動的に制御したい場合、どうしたらよいのでしょうか? acceptor側で指定したいんですけど、、、 グローバルでアクセス可能なvisit先リストに対して追加するしかないのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  当方はVisitorを使用した事がないのですが、acceptでVisitorではなくVisitor[0~N]を引く事になるのではないでしょうか。  http://ja.wikipedia.org/wiki/Visitor_パターン  ただ、上記URLを見ると、オーバーロードによる静的な側面もかなり強い様な気がします。 ・グローバルでアクセス可能なvisit先リストに対して追加するしかないのでしょうか  様々な場所から、visit先のインスタンスをリストに追加する場合、少なくとも、リストは追加元の場所から見えている必要があると思います。  一応C++で変形させてみたのですが、Visitorから遠のいてしまった様です。リストではなく配列にしています。以下参考程度に。 // visitor.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <iostream> #include <ostream> #include <vector> class IVisitor; typedef std::tr1::shared_ptr<IVisitor> IVisitorPtr; typedef std::vector<IVisitorPtr> VectorIVisitorPtr; class IVisitor { public: IVisitor(){ } virtual ~IVisitor(){ } virtual void visit() = 0; }; class CVisitorA : public IVisitor { public: CVisitorA() : IVisitor(){ } virtual ~CVisitorA() { } virtual void visit(){ std::cout << "CVisitorA" << std::endl; } }; class CVisitorB : public IVisitor { public: CVisitorB() : IVisitor(){ } virtual ~CVisitorB() { } virtual void visit(){ std::cout << "CVisitorB" << std::endl; } }; class CVisitorC : public IVisitor { public: CVisitorC() : IVisitor(){ } virtual ~CVisitorC() { } virtual void visit(){ std::cout << "CVisitorC" << std::endl; } }; class IAcceptor { public: IAcceptor(){ } virtual ~IAcceptor(){ } virtual void accept(VectorIVisitorPtr&) = 0; }; class CAcceptor : public IAcceptor { public: CAcceptor() : IAcceptor(){ } virtual ~CAcceptor(){ } virtual void accept(VectorIVisitorPtr& v) { //此処で呼び出し順序を調整する v[1]->visit(); v[0]->visit(); v[2]->visit(); } }; int _tmain(int argc, _TCHAR* argv[]) { //visit先の配列を作成する VectorIVisitorPtr v; v.push_back(IVisitorPtr(new CVisitorA())); v.push_back(IVisitorPtr(new CVisitorB())); v.push_back(IVisitorPtr(new CVisitorC())); CAcceptor a; a.accept(v); return 0; }

noname#115727
質問者

お礼

コードまで書いていただき、どうもありがとうございました