我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)

原创 2013年09月12日 16:07:39

概述:

我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的柜台是不需要有变化的。而我们作为访问者,今天来银行可能是取消费流水,明天来银行可能是去办理手机银行业务,这些是我们访问者的操作,一直是在变化的。

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

类图和样例:


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

具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。

抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量。

具体节点(ConcreteElement)角色:实现了抽象元素所规定的接受操作。

结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。 

样例:

#include <iostream>
#include <string>
#include <list>
using namespace std;

class Element;

class Visitor
{
public:
	virtual void Visit( Element *element ){};
};

// "Element"
class Element
{
public:
	// Methods
	virtual void Accept( Visitor *visitor ){};
};


// "ConcreteElement"
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破坏封装。访问者模式要求访问者对象访问并调用每一个节点对象的操作,这隐含了一个对所有节点对象的要求:它们必须暴露一些自己的操作和内部状态。不然,访问者的访问就变得没有意义。由于访问者对象自己会积累访问操作所需的状态,从而使这些状态不再存储在节点对象中,这也是破坏封装的。

 

LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/11607377】

更多设计模式文章请参考我所理解的设计模式

访问者模式(Visitor Pattern)的c++实现示例

访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无需为它们作任何修改。访问者模式属于行为型模式。 为什么要使用访问者模式?...
  • hityct1
  • hityct1
  • 2009-05-09 23:47:00
  • 6337

C++设计模式实现--访问者(Visitor)模式

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构如下: 二. 举例 假设有一项...
  • L_Andy
  • L_Andy
  • 2014-07-04 16:12:22
  • 1325

Vistor访问者模式(C++访问者模式)

Visitor模式在不破坏类的前提下,为类提供增加新的新操作。 Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,Element类提供接...
  • yc7369
  • yc7369
  • 2014-12-08 23:46:26
  • 762

23种设计模式(9):访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 类型:行为类模式 类图:        访问者模式可能是行为类模式中最复杂的一种...
  • zhengzhb
  • zhengzhb
  • 2012-04-23 14:49:16
  • 60434

C++访问者模式

简述 访问者模式(Visitor Pattern)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 简述 模式结构 优缺点 适用场景 案...
  • u011012932
  • u011012932
  • 2018-02-24 18:06:16
  • 337

c++ 访问者模式

/** VISITOR模式:将操作独立于类之外,类根据自己需要的操作而接受相应的访问者。 这样做的好处是如果需要实现一个新操作,类的结构不用变,特别是整个类层次的操作,如果要变,代价是比较大...
  • TimothyFly
  • TimothyFly
  • 2012-08-16 09:17:34
  • 1405

设计模式C++实现(21)——访问者模式

访问者模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作...
  • zang141588761
  • zang141588761
  • 2016-12-06 11:21:26
  • 155

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016-08-12 12:10:15
  • 4825

C++ 设计模式 —— 访问者(Visitor)

访问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的访问者(基类及其子类) 访问者模式是一种行为型设计模式...
  • lanchunhui
  • lanchunhui
  • 2016-03-28 21:46:56
  • 1009

设计模式C++学习笔记之十八(Visitor访问者模式)

博文很精彩,为方便个人学习特转载,地址:http://www.cnblogs.com/wanggary/archive/2011/04/21/2024099.html 18.1.解释 概念:表...
  • phiall
  • phiall
  • 2016-03-17 23:01:20
  • 335
收藏助手
不良信息举报
您举报文章:我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)