//
// Created by win10 on 2021/11/16.
//
#include <iostream>
#include <vector>
using namespace std;
/*
* 访问者模式
*/
class Man;
class Woman;
class Action {
public:
virtual void getManConclusion(Man* concreteElementA) = 0;
virtual void getWomanConclusion(Woman* concreteElementB) = 0;
};
class Success: public Action {
public:
virtual void getManConclusion(Man* concreteElementA) {
std::cout << __FUNCTION__ << std::endl;
}
virtual void getWomanConclusion(Woman* concreteElementB) {
std::cout << __FUNCTION__ << std::endl;
}
};
class Failure: public Action {
public:
virtual void getManConclusion(Man* concreteElementA) {
std::cout << __FUNCTION__ << std::endl;
}
virtual void getWomanConclusion(Woman* concreteElementB) {
std::cout << __FUNCTION__ << std::endl;
}
};
class Person {
public:
virtual void accept(Action* visitor) = 0;
};
class Man: public Person {
public:
virtual void accept(Action* visitor) {
visitor->getManConclusion(this);
}
};
class Woman: public Person {
public:
virtual void accept(Action* visitor) {
visitor->getWomanConclusion(this);
}
};
// 对象结构类
class ObjectStructure {
public:
void add(Person* person) {
this->m_personList.push_back(person);
}
void display(Action* action) {
for (auto iterator = this->m_personList.begin(); iterator != this->m_personList.end(); iterator++) {
(*iterator)->accept(action);
}
}
private:
vector<Person*> m_personList;
};
int main() {
ObjectStructure* objectStructure = new ObjectStructure();
objectStructure->add(new Man());
objectStructure->add(new Woman());
Success* success = new Success();
objectStructure->display(success);
Failure* failure = new Failure();
objectStructure->display(failure);
return 0;
}