訪問者模式(Visitor):表示一個作用於某對象結構中的各元素的操作,它使你可你在不改變各元素類的前提下定義作用於這些元素的新操作。
五個角色類:
Visitor:為該對象結構中ConcreteElement的每一個類聲明一個Visit操作。
ConcreteVistor:具體訪問者,實現每個由Visitor聲明的操作。每個操作實現演算法的一部分,而該演算法片段是對應於結構中對象的類。
ELement定義一個Accept操作,它以一個訪問者為參數。
ConcreteElement具體元素,實現Accept操作
ObjectStructure能枚舉它的元素,可以提供一個高層的介面以允許訪問者訪問它的元素。
適用場合:
適用於資料結構相對穩定的系統,它把資料結構和作用於資料結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。
訪問者模式的目的是要把處理從資料結構分離出來。很多系統可以按照演算法和資料結構分開,如果這樣的系統有比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得演算法操作的增加變得容易。
其優點:
訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者對象中。
其缺點:
使增加新的資料結構變得困難。
模式實現:
[code]class ConcreteElementA;class ConcreteElementB;class Visitor{public: virtual void VisitConcreteElementA(ConcreteElementA *pElementA) = 0; virtual void VisitConcreteElementB(ConcreteElementB *pElementB) = 0;};class ConcreteVisitor1 : public Visitor{public: void VisitConcreteElementA(ConcreteElementA *pElementA); void VisitConcreteElementB(ConcreteElementB *pElementB);};void ConcreteVisitor1::VisitConcreteElementA(ConcreteElementA *pElementA){ // 現在根據傳進來的pElementA,可以對ConcreteElementA中的element進行操作}void ConcreteVisitor1::VisitConcreteElementB(ConcreteElementB *pElementB){ // 現在根據傳進來的pElementB,可以對ConcreteElementB中的element進行操作}class ConcreteVisitor2 : public Visitor{public: void VisitConcreteElementA(ConcreteElementA *pElementA); void VisitConcreteElementB(ConcreteElementB *pElementB);};void ConcreteVisitor2::VisitConcreteElementA(ConcreteElementA *pElementA){ // ...}void ConcreteVisitor2::VisitConcreteElementB(ConcreteElementB *pElementB){ // ...}// Element objectclass Element{public: virtual void Accept(Visitor *pVisitor) = 0;};class ConcreteElementA : public Element{public: void Accept(Visitor *pVisitor);};void ConcreteElementA::Accept(Visitor *pVisitor){ pVisitor->VisitConcreteElementA(this);}class ConcreteElementB : public Element{public: void Accept(Visitor *pVisitor);};void ConcreteElementB::Accept(Visitor *pVisitor){ pVisitor->VisitConcreteElementB(this);}// ObjectStructure類,能枚舉它的元素,可以提供一個高層的介面以允許訪問者訪問它的元素class ObjectStructure{public: void Attach(Element *pElement); void Detach(Element *pElement); void Accept(Visitor *pVisitor);private: vector<Element *> elements;};void ObjectStructure::Attach(Element *pElement){ elements.push_back(pElement);}void ObjectStructure::Detach(Element *pElement){ vector<Element *>::iterator it = find(elements.begin(), elements.end(), pElement); if (it != elements.end()) { elements.erase(it); }}void ObjectStructure::Accept(Visitor *pVisitor){ // 為每一個element設定visitor,進行對應的操作 for (vector<Element *>::const_iterator it = elements.begin(); it != elements.end(); ++it) { (*it)->Accept(pVisitor); }}
測試案例:
[code]int main(){ ObjectStructure *pObject = new ObjectStructure; ConcreteElementA *pElementA = new ConcreteElementA; ConcreteElementB *pElementB = new ConcreteElementB; pObject->Attach(pElementA); pObject->Attach(pElementB); ConcreteVisitor1 *pVisitor1 = new ConcreteVisitor1; ConcreteVisitor2 *pVisitor2 = new ConcreteVisitor2; pObject->Accept(pVisitor1); pObject->Accept(pVisitor2); if (pVisitor2) delete pVisitor2; if (pVisitor1) delete pVisitor1; if (pElementB) delete pElementB; if (pElementA) delete pElementA; if (pObject) delete pObject; return 0;}
以上就是C++設計模式淺識訪問者模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!