設計模式-行爲-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);

}
相關文章
相關標籤/搜索