機能
プライマリデータ構造とデータの分離操作
解きます
- 主に解決するために:安定と可変データ構造動作可能に結合問題を
- 使用するとき:ターゲット構造の必要性はオブジェクトを、多くの異なる無関係な操作は、これらの操作は、オブジェクトのこれらのクラスの「汚染」を避ける必要が、これらのパッケージは、クラスへの訪問者の使用します
- 解決方法:クラス内でアクセスされるインタフェースを提供するために、外国人観光客の受信を追加
- キーコード:訪問者を受け入れるための方法を有するデータ・ベース・クラス、訪問者が独自の基準に合格します
長所と短所
- 利点:
- 単一責任の原則に沿って、
- 優れた拡張性
- 柔軟性
- 短所:
- 訪問者の特定の要素は、デメテルの原則の違反の詳細を発表しました。
- 変更の具体的な要素はより困難
- 依存関係反転原則に違反し、私たちは抽象的に依存しない特定のクラスに依存しています
シナリオ
- 応用例:あなたの友人の家のゲストは、あなたが訪問者です、友人があなたの友人の説明を通じて、あなたのアクセスを受け付け、その後、友人の記述は、訪問者のパターンがある判断を作ります
- 使用シナリオ:
- オブジェクトの構造はほとんどのオブジェクトクラスに対応した変化しないが、多くの場合、このオブジェクト構造に新しい操作を定義する必要があります
- 新しい操作を追加するとき、対象物の構造の動作と異なると無関係の多くの必要性、およびこれらのアクションは、これらのクラスを変更したくない、これらのオブジェクトの「汚染」クラスを避けるために必要があります
- 注:訪問者が機能を統一することができ、レポート、UI、インターセプター・フィルターを作ることができます
簡単な例のコードセクション
Visitor.h
#ifndef _VISITOR_H_
#define _VISITOR_H_
#include <iostream>
using namespace std;
class ConcreteElementA;
class ConcreteElementB;
class Element;
class Visitor{
public:
virtual ~Visitor(){}
virtual void VisitConcreteElementA(Element* elm) = 0;
virtual void VisitConcreteElementB(Element* elm) = 0;
protected:
Visitor(){}
};
class ConcreteVisitorA:public Visitor {
public:
ConcreteVisitorA(){}
virtual ~ConcreteVisitorA(){}
virtual void VisitConcreteElementA(Element* elm){
cout<<"i will visit ConcreteElementA..."<<endl;
}
virtual void VisitConcreteElementB(Element* elm){
cout<<"i will visit ConcreteElementB..."<<endl;
}
};
class ConcreteVisitorB:public Visitor {
public:
ConcreteVisitorB(){}
virtual ~ConcreteVisitorB(){}
virtual void VisitConcreteElementA(Element* elm){
cout<<"i will visit ConcreteElementA..."<<endl;
}
virtual void VisitConcreteElementB(Element* elm){
cout<<"i will visit ConcreteElementB..."<<endl;
}
};
class Element{
public:
virtual ~Element(){}
virtual void Accept(Visitor* vis) = 0;
protected:
Element(){}
};
class ConcreteElementA:public Element {
public:
ConcreteElementA(){}
~ConcreteElementA(){}
void Accept(Visitor* vis){
vis->VisitConcreteElementA(this);
cout<<"visiting ConcreteElementA..."<<endl;
}
};
class ConcreteElementB:public Element {
public:
ConcreteElementB(){}
~ConcreteElementB(){}
void Accept(Visitor* vis){
cout<<"visiting ConcreteElementB..."<<endl;
vis->VisitConcreteElementB(this);
}
};
#endif
main.cppに
#include "Visitor.h"
#include <iostream>
using namespace std;
int main() {
Visitor* vis = new ConcreteVisitorA();
Element* elm = new ConcreteElementA();
elm->Accept(vis);
return 0;
}