關於訪問者模式,語言表達總是太繞,不如一個具體的實現:
#include<iostream>
#include<string>
#include<chrono>
#include<vector>
using std::cout;
using std::endl;
//前向聲明,訪問者
class Visitor;
//被訪問的抽象類,只有一個接口,用來接受訪問者
class Object
{
public:
virtual void accept(Visitor&v) = 0;
};
//具體的被訪問的對象,學生。
class StudentA :public Object
{
std::string name;
int score;
public:
StudentA(std::string name_);
int getScore();
std::string getName()
{
return name;
}
void setScore(int num);
virtual void accept(Visitor&v);
};
//抽象訪問者,只有一個接口,訪問.
class Visitor
{
public:
virtual void visit(Object* obj)=0;
};
//具體的訪問者一,班主任,實現訪問(學生並給學分)
class ClassLeader :public Visitor
{
public:
virtual void visit(Object* obj);
};
//具體的訪問者二,校長,實現訪問(學生並批評不及格的學生)
class HeadMaster :public Visitor
{
public:
virtual void visit(Object* obj);
};
//隨機分數生成器
class ScoreGen
{
public:
static int getScore()
{
auto tp=std::chrono::system_clock().now();
auto d=tp.time_since_epoch();
int score_temp = d.count() % 100;
return score_temp;
}
};
int main()
{
std::vector<Object*> room;
for (int i = 0; i < 10; i++)
{
std::string name_ = "student";
name_ += std::to_string(i);
room.push_back(new StudentA(name_));
}
ClassLeader leader;
for (auto const& item:room)
{
item->accept(leader);//學生接待班主任(班主任給學分);
}
HeadMaster master;
for (auto const& item : room)
{
item->accept(master);//學生接待校長(校長稽覈);
}
for (auto const& item : room)
{
delete item;
}
return 0;
}
StudentA::StudentA(std::string name_)
:score(0),name(name_)
{
}
int StudentA::getScore()
{
return score;
}
void StudentA::setScore(int num)
{
score = num;
}
void StudentA::accept(Visitor & v)
{
v.visit(this);
}
void ClassLeader::visit(Object * obj)
{
StudentA* s = dynamic_cast<StudentA*>(obj);
int score = ScoreGen::getScore();
s->setScore(score);
std::cout << "班主任來訪:" << s->getName() << ",並給予學分:" << score << endl;
}
void HeadMaster::visit(Object * obj)
{
StudentA* s = dynamic_cast<StudentA*>(obj);
if (s->getScore()<60)
{
cout <<"校長來訪,點名批評"<< s->getName() << ",得分:" << s->getScore() << ",不及格" << endl;
}
}