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;
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值