c++设计模式之访问者模式

来源:互联网 发布:小号软件 编辑:程序博客网 时间:2024/06/08 06:11
#include <iostream>#include <list>#include <string>using namespace std;class CPerson;class CStudent;class CTeacher;class CVisitor;class CPrinter;class CPerson{protected:string name;int gender;CPerson(){}public:virtual void Accept(CVisitor&) = 0;public:void SetName(const string& name){this->name = name;}string GetName()const{return name;}void SetGender(const int& gender){this->gender = gender;}int GetGender() const{return gender;}};class CVisitor{public:virtual void Visit(CStudent&) = 0;virtual void Visit(CTeacher&) = 0;};class CStudent :public CPerson{private:int grade;public:CStudent(string name, int gender, int grade){this->name = name;this->gender = gender;this->grade = grade;}public:virtual void Accept(CVisitor& printer){printer.Visit(*this);}void SetGrade(int grade){this->grade = grade;}int GetGrade()const{return grade;}};class CTeacher :public CPerson{private:int service_time;public:CTeacher(string name, int gender, int service_time){this->name = name;this->gender = gender;this->service_time = service_time;}public:virtual void Accept(CVisitor& printer){printer.Visit(*this);}void SetServiceTime(int service){this->service_time = service_time;}int GetServiceTime() const{return service_time;}};class CPrinter :public CVisitor{public:void Visit(CStudent& s){cout << "student:" << endl;cout << "\tname: " << s.GetName() << endl;if (0 == s.GetGender())cout << "\tGender:" << "female" << endl;elsecout << "\tGender:" << "male" << endl;cout << "\tGrade:" << s.GetGrade() << endl;}void Visit(CTeacher& s){cout << "Teacher:" << endl;cout << "\tname: " << s.GetName() << endl;if (0 == s.GetGender())cout << "\tGender:" << "female" << endl;elsecout << "\tGender:" << "male" << endl;cout << "\tServiceTime:" << s.GetServiceTime() << endl;}};class Organization{private:typedef list<CPerson*> CMemberList;CMemberList member_list;public:void Add(CPerson* person){member_list.push_back(person);}void PrintMembers(CPrinter& printer){CMemberList::iterator it = member_list.begin();for (; it != member_list.end(); ++it){(*it)->Accept(printer);}}~Organization(){CMemberList::iterator it = member_list.begin();for (; it != member_list.end(); ++it){delete *it;}}};int main(){Organization *Planting = new Organization();Planting->Add(new CTeacher("aa", 1, 10));Planting->Add(new CStudent("bb", 0, 1));Planting->Add(new CStudent("cc", 1, 2));CPrinter printer;Planting->PrintMembers(printer);cin.get();}