表示一个作用于某对象结构的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作
案例:假设你的电脑(Element)坏了,找售后,售后告诉你需要拆机检测,检测过程由两个技术人员(Visitor)依次负责不同功能的检测。电脑的部件是固定的,不会有太大的改变,但是如果一种检测方式没有找出问题的话,那么就需要增加检测项。符合访问者模式的特点。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Element;
class CPU;
class MainBoard;
class Visitor
{
public:
Visitor(string name) : m_visitor_name(name) {}
string get_name()
{
return this->m_visitor_name;
}
virtual void visite_cpu(CPU* cpu) = 0;
virtual void visite_mainboard(MainBoard* mainboard) = 0;
private:
string m_visitor_name;
};
// 电脑部件
class Element {
public:
Element(std::string name)
{
m_element_name = name;
}
virtual void accept(Visitor* visitor) = 0;
virtual std::string getName()
{
return this->m_element_name;
}
private:
std::string m_element_name;
};
class CPU : public Element
{
public:
CPU(std::string name) : Element(name) {}
void accept(Visitor* visitor) {
visitor->visite_cpu(this);
}
};
class MainBoard : public Element
{
public:
MainBoard(std::string name) : Element(name) {}
void accept(Visitor* visitor) {
visitor->visite_mainboard(this);
}
};
class CircuitVisitor : public Visitor
{
public:
CircuitVisitor(string name) : Visitor(name) {}
void visite_cpu(CPU* cpu)
{
cout << Visitor::get_name() << "is checking CPU's circuit.(" << cpu->getName() << ")" << endl;
}
void visite_mainboard(MainBoard* mainboard)
{
cout << Visitor::get_name() << "is checking Mainboard's circuit.(" << mainboard->getName() << ")" << endl;
}
};
class FunctionVisitor : public Visitor
{
public:
FunctionVisitor(string name) : Visitor(name) {}
void visite_cpu(CPU* cpu)
{
cout << Visitor::get_name() << "is checking CPU's function.(" << cpu->getName() << ")" << endl;
}
void visite_mainboard(MainBoard* mainboard)
{
cout << Visitor::get_name() << "is checking Mainboard's function.(" << mainboard->getName() << ")" << endl;
}
};
class Computer
{
public:
Computer(CPU* cpu, MainBoard* mainboard)
{
pElementList.push_back(cpu);
pElementList.push_back(mainboard);
};
void Accept(Visitor* visitor) {
for (std::vector<Element*>::iterator i = pElementList.begin(); i != pElementList.end(); i++)
{
(*i)->accept(visitor);
}
};
private:
std::vector<Element*> pElementList;
};
void test_01()
{
CPU* cpu = new CPU("Intel CPU");
MainBoard* mainboard = new MainBoard("Huipu mainboard");
Computer* my_computer = new Computer(cpu, mainboard);
CircuitVisitor* visitor1 = new CircuitVisitor("CircuitVisitor");
FunctionVisitor* visitor2 = new FunctionVisitor("FunctionVisitor");
cout << "Step 1: CircuitVisitor is checking computer's circuits." << endl;
my_computer->Accept(visitor1);
cout << "Step 2: FunctionVisitor is checking computer's functions." << endl;
my_computer->Accept(visitor2);
}
int main()
{
test_01();
system("pause");
return 0;
}