C++設計模式淺識訪問者模式

來源:互聯網
上載者:User
訪問者模式(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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.