首页 > 代码库 > visitor模式

visitor模式

 

转自http://blog.csdn.net/lcl_data/article/details/11607377

 

访问者模式就是表示一个作用于某对象结构中的个元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的操作

抽象访问者:

声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。

具体访问者:

实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作

抽象节点

声明一个接受操作,接受一个访问者对象作为一个参量

具体节点

实现抽象元素所规定的操作

结构对象

如果需要,提供一个高高层次的接口让访问者对象可以访问每一个元素,如果需要,可以设计成一个符合对象或者一个聚集

 

样例

#include<iostream>#include <string>#include <list>using namespace std;class Element;class Visitor{public:    virtual void Visit(Element *element){};};class Element{public:     virtual void Accept(Visitor *visitor){};};class Employee:public Element{public:    string name;	double income;	int vacationDays;public:    Employee(string name,double income,int vacationDays)	{	     this->name=name;		 this->income=income;		 this->vacationDays=vacationDays;	}			void Accept(Visitor *visitor)    {	    visitor->Visit(this);	}};class IncomeVisitor : public Visitor{public:		void Visit( Element *element )	{		Employee *employee = ((Employee*)element);		employee->income *= 1.10;		cout<<employee->name<<" ‘s new income: " <<employee->income<<endl;	}};class VacationVisitor : public Visitor{public :	void Visit( Element *element )	{		Employee *employee = ((Employee*)element);		// Provide 3 extra vacation days		employee->vacationDays += 3;				cout<<employee->name<<" ‘s new vacation days: " <<employee->income<<endl;	}}; 	// "ObjectStructure"		class Employees{	private :	list< Employee*> employees;public :	void Attach( Employee *employee )	{				employees.push_back(employee);			}	void Detach( Employee *employee )	{		employees.remove(employee);			}	void Accept( Visitor *visitor )	{				for (std::list<Employee*>::iterator it=employees.begin(); it != employees.end(); ++it)			(*it)->Accept(visitor);	}};						void main( ){	Employees *e = new Employees();	e->Attach( new Employee( "Tom", 25000.0, 14 ) );	e->Attach( new Employee( "Thomas", 35000.0, 16 ) );	e->Attach( new Employee( "Roy", 45000.0, 21 ) );	// Create two visitors	IncomeVisitor *v1 = new IncomeVisitor();	VacationVisitor *v2 = new VacationVisitor();	// Employees are visited	e->Accept( v1 );	e->Accept( v2 );}			

 

优点

1、访问者模式使得增加新的操作变得很容易,使用访问者模式,增加新的操作意味着增加一个新的访问类,

2、访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个节点类中

3.访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类,迭代子只能访问同一个类型等级结构的成员对象

4、积累状态

每一个单独的访问者对象集中了相关的行为,从而也就可以在访问的过程中将执行操作的状态积累在自己内部

缺点

1、增加新的节点变得很困难,没增加一新的节点意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个访问者类中增加相应的具体操作

2、破坏封装

访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含菏泽一个队所有节点对象的要求

它们必须暴露一些自己的操作和内部状态。不然,访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态不再存储在节点对象中,这也是破坏封装的。

 

visitor模式