访问者模式
1. 访问者模式:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
2. 访问者模式:
访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解开,使操作集合可以相对自由的演化。
访问者模式的目的是要把数据从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法,使用访问者模式比较合适,因为访问者模式使得算法操作的增加变得容易。
优点是,增加新的操作很容易,因为增加新的操作意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
通常ConcreteVisitor可以单独开发,不必跟ConcreteElementA或ConcreteElementB写在一起。正因为这样,ConcreteVisitor能提高ConcreteElement之间的独立性,如果把一个处理动作设计成ConcreteElementA和ConcreteElementB类方法,每次想新增处理以扩充功能时就得去修改这两个类。
缺点其实也就是使增加新的数据结构变得困难了。
大多时候并不需要访问者模式,担当一旦你需要访问者模式时,那就是真的需要了。事实上,我们很难找到数据结构不变的情况,所以用访问者模式的机会也就不太多。
3. 访问者模式实例:
#include <iostream>
#include <list>
#include <string>
using namespace std;
class Man;
class Woman;
class Action
{
public:
virtual void getManConclusion(Man *)=0;
virtual void getWomanConclusion(Woman *)=0;
};
class Success:public Action
{
void getManConclusion(Man *)
{
cout<<"男人成功时,背后多半有一个伟大的女人"<<endl;
}
void getWomanConclusion(Woman *)
{
cout<<"女人成功时,背后多半有不成功的男人"<<endl;
}
};
class Love:public Action
{
void getManConclusion(Man *)
{
cout<<"男人恋爱时,凡事不懂装懂"<<endl;
}
void getWomanConclusion(Woman *)
{
cout<<"女人恋爱时,凡事懂也装不懂"<<endl;
}
};
class Person
{
public:
virtual void accept(Action*)=0;
};
class Man:public Person
{
public:
void accept(Action* visitor)
{
visitor->getManConclusion(this);
}
};
class Woman:public Person
{
public:
void accept(Action* visitor)
{
visitor->getWomanConclusion(this);
}
};
class ObjectStructure//对象结构
{
private:
list<Person*> elements;
public:
void attach(Person* element)//增加
{
elements.push_back(element);
}
void detach(Person* element)//移除
{
for(list<Person*>::iterator iter=elements.begin();iter!=elements.end();++iter)
{
if((*iter)==element)
{
elements.erase(iter);
}
}
}
void display(Action *visitor)
{
for(list<Person*>::iterator iter=elements.begin();iter!=elements.end();++iter)
{
(*iter)->accept(visitor);
}
}
};
int main()
{
ObjectStructure os=new ObjectStructure();
Success *s=new Success();//成功时的反应
os->display(s);
Love *lv=new Love();//恋爱时的反应
os->display(lv);
return 0;
}