問題:數據結構
oop開發中常常遇到需求變動,設計好的一個系統原型,客戶的新需求來了,咱們不得不更改已有的餓設計,最多見的方案就是
ide
添加新類 或 新方法 來實現需求,這樣機會不停的打補丁,設計不可能封閉,oop
訪問者模式就是把要變更的 ,更新的 封裝到一個類中(訪問操做),由待更改的類提供一個接受接口,在不改變數據結構的狀況下this
,添加新功能(不修改Element的條件下 添加新操做,可經過擴展子類)spa
這裏涉及到一個Double Dispatch 問題.net
具體調用哪個Accept 由2個決定因素設計
Accept是多態操做,因此要具體的Element 子類code
由於Accept 參數類型是Visitor 要實際ConcreateVisitor才能決定。blog
因此要派發2次,訪問者模式就是Double Dispatch的一種實現
接口
關於double dispatch 在 http://my.oschina.net/kkkkkkkkkkkkk/blog/671305 闡述
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); }