访问者模式
其他二十三种设计模式
#include<iostream>
#include<list>
using namespace std;
class Action;
class Person {
public:
virtual void Accept(Action* _visitor) = 0;
};
class Man;
class Woman;
class Action {
public:
virtual void GetManConclusion(Man* _concreteElement) = 0;
virtual void GetWomanConclusion(Woman* _concreteElement) = 0;
};
class Man :public Person {
public:
string GetMan() {
return man;
}
virtual void Accept(Action* _visitor) {
_visitor->GetManConclusion(this);
}
private:
string man = "男人";
};
class Woman :public Person {
public:
string GetWoman() {
return woman;
}
virtual void Accept(Action* _visitor) {
_visitor->GetWomanConclusion(this);
}
private:
string woman = "女人";
};
class ObjectStructure {
public:
void Attach(Person* _element) {
elements->push_back(_element);
}
void Detach(Person* _element) {
elements->push_back(_element);
}
void Display(Action* _visitor) {
for (list<Person*>::iterator it = elements->begin(); it != elements->end(); it++) {
(*it)->Accept(_visitor);
}
}
private:
list<Person*>* elements = new list<Person*>;
};
class Success :public Action {
public:
Success(string _action) {
this->action = _action;
}
virtual void GetManConclusion(Man* _concreteElement) {
cout << _concreteElement->GetMan() << this->action << "时,背后多半有一个伟大的女人" << endl;
}
virtual void GetWomanConclusion(Woman* _concreteElement) {
cout << _concreteElement->GetWoman() << this->action << "时,背后多半有一个不成功的男人" << endl;
}
private:
string action = "";
};
class Failing :public Action {
public:
Failing(string _action) {
this->action = _action;
}
virtual void GetManConclusion(Man* _concreteElement) {
cout << _concreteElement->GetMan() << this->action << "时,闷头喝酒,谁也不用劝" << endl;
}
virtual void GetWomanConclusion(Woman* _concreteElement) {
cout << _concreteElement->GetWoman() << this->action << "时,眼泪汪汪,谁也劝不了" << endl;
}
private:
string action = "";
};
class Amativeness :public Action {
public:
Amativeness(string _action) {
this->action = _action;
}
virtual void GetManConclusion(Man* _concreteElement) {
cout << _concreteElement->GetMan() << this->action << "时,凡是不懂也要装懂" << endl;
}
virtual void GetWomanConclusion(Woman* _concreteElement) {
cout << _concreteElement->GetWoman() << this->action << "时,遇事懂也装作不懂" << endl;
}
private:
string action = "";
};
class Marriage :public Action {
public:
Marriage(string _action) {
this->action = _action;
}
virtual void GetManConclusion(Man* _concreteElement) {
cout << _concreteElement->GetMan() << this->action
<< "时,感慨道: 恋爱游戏终结时,‘有妻徒刑’遥无期" << endl;
}
virtual void GetWomanConclusion(Woman* _concreteElement) {
cout << _concreteElement->GetWoman() << this->action
<< "时,欣慰道: 爱情长跑路漫漫,婚姻保险保平安" << endl;
}
private:
string action = "";
};
void test1() {
ObjectStructure* os = new ObjectStructure;
os->Attach(new Man);
os->Attach(new Woman);
Action* v1 = new Success("成功");
os->Display(v1);
Action* v2 = new Failing("失败");
os->Display(v2);
Action* v3 = new Amativeness("恋爱");
os->Display(v3);
Action* v4 = new Marriage("结婚");
os->Display(v4);
delete v4;
delete v3;
delete v2;
delete v1;
delete os;
}
int main() {
test1();
return 0;
}