访问者模式

来源:互联网 发布:淘宝女包店铺介绍 编辑:程序博客网 时间:2024/06/05 03:29
#include <iostream>
#include <string>
//#include <afx.h>
#include <vector>
#include <list>
using namespace std;


class Man;
class Woman;


class Action
{
public:
string status;
public:
virtual void GetManConclusion(Man *concreteElementA) = 0;
virtual void GetWomanConclusion(Woman *concreteElementA) = 0;
};


class Success:public Action
{
public:
Success()
{
status = "成功";
}
virtual void GetManConclusion(Man *concreteElementA);
virtual void GetWomanConclusion(Woman *concreteElementB);
};


class Fail:public Action
{
public:
Fail()
{
status = "失败";
}
virtual void GetManConclusion(Man *concreteElementA);
virtual void GetWomanConclusion(Woman *concreteElementB);
};




class Person
{
public:
string sex;
public:
virtual void PersonAccept(Action *visitor) = 0;
};


class Man:public Person
{
public:
Man()
{
sex = "男人";
}
virtual void PersonAccept(Action *visitor)
{
visitor->GetManConclusion(this);
}
};


class Woman:public Person
{
public:
Woman()
{
sex = "女人";
}
virtual void PersonAccept(Action *visitor)
{
visitor->GetWomanConclusion(this);
}
};


void Success::GetManConclusion(Man *concreteElementA)
{
cout<<concreteElementA->sex<<this->status<<"背后多半有一个伟大的女人\n";
}


void Success::GetWomanConclusion(Woman *concreteElementB)
{
cout<<concreteElementB->sex<<this->status<<"背后大多有一个不成功的男人\n";
}


void Fail::GetManConclusion(Man *concreteElementA)
{
cout<<concreteElementA->sex<<this->status<<"闷头喝酒,谁也不用劝\n";
}


void Fail::GetWomanConclusion(Woman *concreteElementB)
{
cout<<concreteElementB->sex<<this->status<<"眼泪旺旺,谁也劝不了\n";
}


class ObjectStructure
{
list<Person *>CI;
list<Person *>::iterator i;
public:
void Attach(Person * p)
{
CI.push_back(p);
}


void Detach()
{
CI.pop_back();
}


void Display(Action *a)
{
for (i = CI.begin(); i != CI.end(); ++i) 
(*i)->PersonAccept(a);
}
};




int main()
{
ObjectStructure o;
o.Attach(new Man());
o.Attach(new Woman());


Success v1;
o.Display(&v1);


Fail v2;
o.Display(&v2);


cout<<"\nOK\n";
return 1;
}
原创粉丝点击