设计模式-行为-Visitor(访问者)模式

问题:数据结构

    oop开发中常常遇到需求变动,设计好的一个系统原型,客户的新需求来了,咱们不得不更改已有的饿设计,最多见的方案就是
ide

添加新类 或 新方法 来实现需求,这样机会不停的打补丁,设计不可能封闭,oop

访问者模式就是把要变更的 ,更新的 封装到一个类中(访问操做),由待更改的类提供一个接受接口,在不改变数据结构的状况下this

,添加新功能(不修改Element的条件下 添加新操做,可经过扩展子类)spa


这里涉及到一个Double Dispatch 问题.net

具体调用哪个Accept 由2个决定因素设计

  1. Accept是多态操做,因此要具体的Element 子类code

  2. 由于Accept 参数类型是Visitor 要实际ConcreateVisitor才能决定。blog

因此要派发2次,访问者模式就是Double Dispatch的一种实现
接口

关于double dispatch 在    http://my.oschina.net/kkkkkkkkkkkkk/blog/671305   阐述


  1. Visitor 能够为每一个Element写一个访问接口,也能够经过重载或 RTTI 来简化接口的设计


#include "PublicHeaders.h"

#pragma once
class Visitor;

 
class Element
{
public:
	void Print()
	{
		cout << " this is element" << __FUNCTION__ << endl;
	}
	/**
	* @brief the interface of visitor's visit
	*/
	virtual void Accept(Visitor *visitor) = 0;
};

class Visitor
{
public:
	virtual void VisitElementA(Element*ele) = 0;

};




class ConCreateVisitor :public Visitor
{
public:

	void VisitElementA(Element *ele)
	{
		ele->Print();
	}
};

class ConCreateElementA :public Element
{
public:
	virtual void Accept(Visitor *visitor)override
	{
		visitor->VisitElementA(this);
	}
};




void testVisitor()
{
	Element *ele = new ConCreateElementA;
	Visitor *vis = new ConCreateVisitor;

	ele->Accept(vis);

}
相关文章
相关标签/搜索