大话设计模式访问者模式c++实现

访问者模式

其他二十三种设计模式

#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;
}

猜你喜欢

转载自blog.csdn.net/wode_0828/article/details/114285249