设计模式-访问者模式

适用情境 : 把对象和对象上的次要操作分离开,以符合单一职责原则.

这里写图片描述

// visitor.h
#ifndef VISITOR_H
#define VISITOR_H

class Server;

class Visitor
{
public:
    virtual void VisitServerA(Server* serverA) = 0;
    virtual void VisitServerB(Server* serverB) = 0;
};

#endif // VISITOR_H
// concretevisitora.h
#ifndef CONCRETEVISITORA_H
#define CONCRETEVISITORA_H

#include "visitor.h"

class ConcreteVisitorA : public Visitor
{
public:
    virtual void VisitServerA(Server *serverA);
    virtual void VisitServerB(Server *serverB);
};

#endif // CONCRETEVISITORA_H
// concretevisitora.cpp
#include "concretevisitora.h"
#include <iostream>
#include "server.h"

void ConcreteVisitorA::VisitServerA(Server* serverA)
{
    std::cout << "ConcreteVisitorA visit "<< serverA->m_name << std::endl;
}

void ConcreteVisitorA::VisitServerB(Server *serverB)
{
    std::cout << "ConcreteVisitorA visit "<< serverB->m_name << std::endl;
}
// concretevisitorb.h
#ifndef CONCRETEVISITORB_H
#define CONCRETEVISITORB_H

#include "visitor.h"

class ConcreteVisitorB : public Visitor
{
public:
    virtual void VisitServerA(Server *serverA);
    virtual void VisitServerB(Server *serverB);
};

#endif // CONCRETEVISITORB_H
// concretevisitorb.cpp
#include "concretevisitorb.h"
#include <iostream>
#include "server.h"

void ConcreteVisitorB::VisitServerA(Server* serverA)
{
    std::cout << "ConcreteVisitorB visit "<< serverA->m_name << std::endl;
}

void ConcreteVisitorB::VisitServerB(Server *serverB)
{
    std::cout << "ConcreteVisitorB visit "<< serverB->m_name << std::endl;
}
// server.h
#ifndef SERVER_H
#define SERVER_H

#include "visitor.h"
#include <string>

class Server
{
public:
    std::string m_name;
public:
    virtual void Accept(Visitor* visitor) = 0;

};

#endif // SERVER_H
// concreteservera.h
#ifndef CONCRETESERVERA_H
#define CONCRETESERVERA_H

#include "server.h"

class ConcreteServerA : public Server
{
public:
    virtual void Accept(Visitor *visitor);
};

#endif // CONCRETESERVERA_H
// concreteservera.cpp
#include "concreteservera.h"

void ConcreteServerA::Accept(Visitor *visitor)
{
    this->m_name = "ConcreteServerA ";
    visitor->VisitServerA(this);
}
// concreteserverb.h
#ifndef CONCRETESERVERB_H
#define CONCRETESERVERB_H

#include "server.h"

class ConcreteServerB : public Server
{
public:
    virtual void Accept(Visitor *visitor);
};

#endif // CONCRETESERVERB_H
// concreteserverb.cpp
#include "concreteserverb.h"

void ConcreteServerB::Accept(Visitor *visitor)
{
    this->m_name = "ConcreteServerB";
    visitor->VisitServerB(this);
}
// objectstruct.h
#ifndef OBJECTSTRUCT_H
#define OBJECTSTRUCT_H

#include "visitor.h"
#include "server.h"
#include <vector>

class ObjectStruct
{
public:
    std::vector<Server*> m_serverList;
    void AddServer(Server* server);
    void Run(Visitor* visitor);
};

#endif // OBJECTSTRUCT_H
// objectstruct.cpp
#include "objectstruct.h"

void ObjectStruct::AddServer(Server *server)
{
    m_serverList.push_back(server);
}

void ObjectStruct::Run(Visitor *visitor)
{
    for(std::vector<Server*>::iterator it = m_serverList.begin();
        it != m_serverList.end();
        it++)
    {
        (*it)->Accept(visitor);
    }
}

客户端:

// main.cpp
#include <iostream>
#include "objectstruct.h"
#include "concreteservera.h"
#include "concreteserverb.h"
#include "concretevisitora.h"
#include "concretevisitorb.h"

using namespace std;

int main(int argc, char *argv[])
{
    Server* serverA = new ConcreteServerA();
    Server* serverB = new ConcreteServerB();
    Visitor* visitorA = new ConcreteVisitorA();
    Visitor* visitorB = new ConcreteVisitorB();

    ObjectStruct* objectstruct = new ObjectStruct();
    objectstruct->AddServer(serverA);
    objectstruct->AddServer(serverB);

    objectstruct->Run(visitorA);
    objectstruct->Run(visitorB);

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值