C++设计模式--访问者模式

来源:互联网 发布:淘宝寄空包 编辑:程序博客网 时间:2024/06/06 00:42

访问者模式(Visitor)分离了类的内部元素与访问它们的操作,可以在不改变内部元素的情况下增加作用于它们的新操作。如果一个类有很多内部数据,因此也就有很多访问操作,这样会使它的接口非常庞大,难以变动难以学习。访问者模式可以做到数据的存储与使用分离,不同的访问者可以集中不同类别的操作,并且可以随时增加新的访问者或者新方法来增加新的操作。

GOOD:适用于数据结构稳定的系统。它把数据结构和作用于数据结构上的操作分离开,使得操作集合。新增加操作很容易,因为增加新操作就相当于增加一个访问者,访问者模式将有关的行为集中到一个访问者对象中。

 

RES:http://hi.baidu.com/xuehuo_0411/item/836ba94257b52ae5bdf451e8


C++实现:

#include <iostream>#include <vector>using namespace std; class Man;class Woman; // 行为class Action{public:virtual void GetManConclusion(Man* concreteElementA) = 0;virtual void GetWomanConclusion(Woman* concreteElementB) = 0;}; // 成功class Success : public Action{public:virtual void GetManConclusion(Man* concreteElementA){cout << "男人成功时,背后有个伟大的女人" << endl;}virtual void GetWomanConclusion(Woman* concreteElementB){cout << "女人成功时,背后有个没用的男人" << endl;}}; // 失败class Failure : public Action{public:virtual void GetManConclusion(Man* concreteElementA){cout << "男人失败时,背后有个伟大的女人" << endl;}virtual void GetWomanConclusion(Woman* concreteElementB){cout << "女人失败时,背后有个没用的男人" << endl;}}; // 抽象人类class Person{public:virtual void Accept(Action* visitor) = 0;}; // 男人class Man : public Person{public:virtual void Accept(Action* visitor){visitor->GetManConclusion(this);}}; // 女人class Woman : public Person{public:virtual void Accept(Action* visitor){visitor->GetWomanConclusion(this);}}; // 对象结构类class ObjectStructure{public:void Add(Person* p) { m_personList.push_back(p); }void Display(Action* a);private:vector<Person*> m_personList;}; void ObjectStructure::Display(Action* a){vector<Person*>::iterator it;for (it=m_personList.begin(); it!=m_personList.end(); ++it){(*it)->Accept(a);}} int main(int argc, char* argv[]){ObjectStructure* os = new ObjectStructure();os->Add(new Man());os->Add(new Woman());Success* succ = new Success();os->Display(succ);Failure* fail = new Failure();os->Display(fail);return 0;}


 

原创粉丝点击