ゲストモードは:素人の面では、指定した役割がアクセスするために訪問者がアクセスしたときに、来場者の役割を定義することです。
侵襲的なゲストモードでは、唯一のプラス中で、クラス内でアクセスされる外国人観光客のインタフェースの受信を提供しています。
ゲストモードの利点:
- 単一責任の原則に沿って。役割の特定の要素をロードすると、データのために責任がある、と報告を担当する来場者の役割を表示するには、2つの非常に異なる責任を明確に分離し、それらの変化の解釈。
- 職務の分離に優れたスケーラビリティは、データの操作は非常に高速で増加し続けています。
ゲストモードのシナリオ:
- オブジェクトの構造はほとんどのオブジェクトクラスに対応した変化しないが、多くの場合、オブジェクト構造に新しい操作を定義する必要があります。
- 多くの異なると無関係な操作でオブジェクトの構造のためのオブジェクト、およびこれらの操作の必要性は、これらのオブジェクトの「汚染」クラスを避けるために必要がある、我々は新しい操作を追加する際に、これらのクラスを変更する必要はありません。
class Visitor;
//被访问类基类: 网站
class Website
{
public:
virtual ~Website(){ std::cout << "~Website()" << std::endl;}
virtual void accept(Visitor&) = 0;
};
//被访问类具体实现类: 淘宝网
class TaoBao : public Website
{
public:
void accept(Visitor &v) override;
void shopping();
};
//被访问类具体实现类: 优酷
class YouKu : public Website
{
public:
void accept(Visitor &v) override;
void playVideo();
};
//访客类基类
class Visitor
{
public:
Visitor() = default;
Visitor(const std::string &name) : m_name(name){}
virtual ~Visitor(){ std::cout << "~Visitor()" << std::endl;}
virtual void visit(TaoBao &web) = 0;
virtual void visit(YouKu &web) = 0;
protected:
std::string m_name{"unknow"};
};
//访客具体实现类: 普通游客用户
class GeneralVisitor : public Visitor
{
public:
void visit(TaoBao &web) override;
void visit(YouKu &web) override;
};
//访客具体实现类: VIP用户
class VIPVisitor : public Visitor
{
public:
VIPVisitor(const std::string &name) : Visitor(name){}
void visit(TaoBao &web) override;
void visit(YouKu &web) override;
};
//
void YouKu::accept(Visitor &v)
{
v.visit(*this);
}
void YouKu::playVideo()
{
std::cout << "Watch the video" << std::endl;
}
void TaoBao::accept(Visitor &v)
{
v.visit(*this);
}
void TaoBao::shopping()
{
std::cout << "Online shopping" << std::endl;
}
void GeneralVisitor::visit(TaoBao &web)
{
web.shopping();
}
void GeneralVisitor::visit(YouKu &web)
{
web.playVideo();
}
void VIPVisitor::visit(TaoBao &web)
{
std::cout << m_name << ": ";
web.shopping();
}
void VIPVisitor::visit(YouKu &web)
{
std::cout << m_name << ": ";
web.playVideo();
}
//测试
int main()
{
TaoBao tb;
YouKu yk;
GeneralVisitor gVisitor;
VIPVisitor vVisitor{"zhangsan"};
yk.accept(gVisitor);
tb.accept(gVisitor);
yk.accept(vVisitor);
tb.accept(vVisitor);
return 0;
}
符号の大量の調製のための上記の方法からのアクセスクラスの多数は、ビジターでクラスを対応するビューを必要とします。ビジタークラスが実装されている追加の方法は、具体的なクラスのビジタークラス、抽象クラスに依存しないに依存します。