您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-25 16:18 363 查看
#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;
else
cout << "\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;
else
cout << "\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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: