日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

23种设计模式C++源码与UML实现--访问者模式

發布時間:2025/3/15 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 23种设计模式C++源码与UML实现--访问者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訪問者模式

Vistor模式也叫訪問者模式,是行為模式之一,它分離對象的數據和行為,使用Vistor模式,可以不修改已有類的情況下,增加新的操作角色和職責。

抽象訪問者(Visitor)角色:聲明了一個或者多個訪問操作,形成所有的具體元素角色必須實現的接口。

具體訪問者(ConcreteVisitor)角色:實現抽象訪問者角色所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。

抽象節點(Element)角色:聲明一個接受操作,接受一個訪問者對象作為一個參量。

具體節點(ConcreteElement)角色:實現了抽象元素所規定的接受操作。

結構對象(ObiectStructure)角色:有如下的一些責任,可以遍歷結構中的所有元素;如果需要,提供一個高層次的接口讓訪問者對象可以訪問每一個元素;如果需要,可以設計成一個復合對象或者一個聚集,如列(List)或集合(Set)。

適用于

把數據結構 和 作用于數據結構上的操作 進行解耦合; 適用于數據結構比較穩定的場合

訪問者模式總結

訪問者模式優點是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者對象中。
那訪問者模式的缺點是是增加新的數據結構變得困難了

優缺點

訪問者模式有如下的優點:

  • 訪問者模式使得增加新的操作變得很容易。如果一些操作依賴于一個復雜的結構對象
    的話,那么一般而言,增加新的操作會很復雜。而使用訪問者模式,增加新的操作就意味
    著增加一個新的訪問者類,因此,變得很容易。
  • 訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。
  • 訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。迭代子只
    能訪問屬于同一個類型等級結構的成員對象,而不能訪問屬于不同等級結構的對象。訪問
    者模式可以做到這一點。
  • 積累狀態。每一個單獨的訪問者對象都集中了相關的行為,從而也就可以在訪問的過
    程中將執行操作的狀態積累在自己內部,而不是分散到很多的節點對象中。這是有益于系
    統維護的優點。
  • 訪問者的缺點:

  • 增加新的節點類變得很困難。每增加一個新的節點都意味著要在抽象訪問者角色中增
    加一個新的抽象操作,并在每一個具體訪問者類中增加相應的具體操作。
  • 破壞封裝。訪問者模式要求訪問者對象訪問并調用每一個節點對象的操作,這隱含了
    一個對所有節點對象的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的
    訪問就變得沒有意義。由于訪問者對象自己會積累訪問操作所需的狀態,從而使這些狀態
    不再存儲在節點對象中,這也是破壞封裝的。
  • 案例需求:

    比如有一個公園,有一到多個不同的組成部分;該公園存在多個訪問者:清潔工 A 負責打掃公園的 A 部分,清潔工 B 負責打掃公園的 B 部分,公園的管理者負責檢點各項事務是否完成,上級領導可以視察公園等等。也就是說,對于同一個公園,不同的訪問者有不同的行為操作,而且訪問者的種類也可能需要根據時間的推移而變化(行為的擴展性)。
    根據軟件設計的開閉原則(對修改關閉,對擴展開放),實現需求。

    // // Created by andrew on 2020/11/28. // #include <iostream> #include <list>using namespace std;class ParkElement;class Visitor{ public:virtual ~Visitor() = default;virtual void visit(ParkElement *parkElement) = 0; };class ParkElement{ public:virtual ~ParkElement() = default;virtual void accept(Visitor *visitor) = 0; };class ParkA : public ParkElement{ public:void accept(Visitor *v) override{// 公園接收訪問者, 讓訪問者操作v->visit(this);} };class ParkB : public ParkElement{ public:void accept(Visitor *v) override{v->visit(this);} };// 整個公園 class Park : ParkElement { public:Park(){m_list.clear();}void setParkElement(ParkElement *pe){m_list.push_back(pe);}void accept(Visitor *v) override{for(auto it=m_list.begin();it!=m_list.end(); it++){(*it)->accept(v);}}private:list<ParkElement *>m_list; };class VisitorA : public Visitor{void visit(ParkElement *parkElement) override {cout << "part A is clear" << endl;} };class VisitorB : public Visitor { public:void visit(ParkElement *parkElement) override{cout << "part B is clear" << endl;} };class ManagerVisitor : public Visitor { public:void visit(ParkElement * parkElement) override {cout << "visit all part" << endl;} };void PartVisitor() {Visitor *vA = new VisitorA;Visitor *vB = new VisitorB;auto *parkA = new ParkA;auto *parkB = new ParkB;parkA->accept(vA);parkB->accept(vB);delete vA;delete vB;delete parkB;delete parkA; }void ManagerVisit() {Visitor *vManager = new ManagerVisitor;Park *park = new Park;ParkElement *parkA = new ParkA;ParkElement *parkB = new ParkB;park->setParkElement(parkA);park->setParkElement(parkB);// 整個公園接受管理員的訪問park->accept(vManager);delete parkA;delete parkB;delete park;delete vManager; }int main(int argc, char* argv[]){PartVisitor();ManagerVisit();return 0; }

    總結

    以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--访问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。