c++ visitor 設計模式

關於訪問者模式,語言表達總是太繞,不如一個具體的實現:

#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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章