最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)訪問者模式的基礎介紹

 更新時間:2021年09月18日 16:09:47   作者:herryone123  
訪問者模式表示一個作用于某對象結(jié)構中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對C++訪問者模式相關知識感興趣的朋友一起看看吧

一、訪問者模式基礎知識

1.1 模式動機

       對于系統(tǒng)中的某些對象中可能存在多種不同類型的元素,而且不同的調(diào)用者使用這些元素時也有所區(qū)別,這些調(diào)用者稱為訪問者。

        訪問者模式(Visitor Pattern):表示一個作用于某對象結(jié)構中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

訪問者模式的應用場景:

  • 訪問者模式適用于數(shù)據(jù)結(jié)構相對穩(wěn)定的系統(tǒng)
  • 它把數(shù)據(jù)結(jié)構和作用于數(shù)據(jù)結(jié)構之上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。
  • 訪問者模式的目的是要把處理從數(shù)據(jù)結(jié)構分離出來。如果這樣的系統(tǒng)有比較穩(wěn)定的數(shù)據(jù)結(jié)構,又有已與變化的算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得算法操作的增加變得更容易。反之亦然。

1.2 訪問者模式結(jié)構

 訪問者模式中對象結(jié)構存儲了不同類型的元素對象,以提供不同訪問者訪問。訪問者模式包括兩個層次結(jié)構,一個是訪問者層次結(jié)構,提供了抽象訪問者和具體訪問者,一個是元素層次結(jié)構,提供了抽象元素和具體元素。

相同的訪問者可以以不同的方式訪問不同的元素,相同的元素可以接受不同訪問者以不同的方式訪問。

(1)Visitor (抽象訪問者)

抽象訪問者為對象結(jié)構類中每一個具體元素類聲明一個訪問操作。

(2)ConcreteVisitor (具體訪問者)

具體訪問者實現(xiàn)了每個由抽象訪問者聲明的操作,每一個操作用于訪問對象結(jié)構中一種元素類型的元素。

(3)Element(抽象元素)

抽象元素一般是抽象類或接口,定義一個accept()方法,該方法以一個抽象訪問者作為參數(shù)。

(4)ConcreteElement (具體元素)

具體訪問者實現(xiàn)了accept()方法,在其accept()

(5)ObjectStructure(對象結(jié)構)

對象結(jié)構是一個元素的集合,它用于存放元素對象,并且提供了遍歷其內(nèi)部元素的方法。

1.3 訪問者模式優(yōu)缺點

訪問者模式優(yōu)點:

  • 訪問者模式的優(yōu)點就是增加新的操作很容易,因為增加新的操作就意味著增加一個新的訪問者。訪問者模式將有關的行為集中到一個訪問者對象中。

模式的缺點:

  • 使增加新的元素類變得困難。在訪問者模式中,每增加一個新的元素都意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者中增加相應的具體操作,違背“開閉原則”的要求。

1.4 訪問者模式應用

#include <iostream>
 
#include <vector>
 
using namespace std;
 
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){
        // 現(xiàn)在根據(jù)傳進來的pElementA,可以對ConcreteElementA中的element進行操作
    }
 
     void VisitConcreteElementB(ConcreteElementB *pElementB){
         // 現(xiàn)在根據(jù)傳進來的pElementB,可以對ConcreteElementB中的element進行操作
    }
 
};
 
/*具體訪問者2*/
class ConcreteVisitor2 : public Visitor
{
 
public:
     void VisitConcreteElementA(ConcreteElementA *pElementA){
    }
     void VisitConcreteElementB(ConcreteElementB *pElementB){
    }
};
 
 
/*抽象元素類 聲明accept()方法,用于接受訪問者的訪問*/
class Element
 
{
public:
     virtual void Accept(Visitor *pVisitor) = 0;//accept用于接受訪問者的訪問
};
 
/*具體元素類 通過調(diào)用Visitor類的visit()方法實現(xiàn)對元素的訪問*/
class ConcreteElementA : public Element
{
public:
     void Accept(Visitor *pVisitor)//通過調(diào)用visitor對象的 visit()方法實現(xiàn)對元素對象的訪問
    {
        pVisitor->VisitConcreteElementA(this);
    }
};
 
/*具體元素類 */
class ConcreteElementB : public Element
{
public:
     void Accept(Visitor *pVisitor)
    {
     pVisitor->VisitConcreteElementB(this);
    }
};
 
// ObjectStructure類(對象結(jié)構類),能枚舉它的元素,可以提供一個高層的接口以允許訪問者訪問它的元素
class ObjectStructure
{
public:
     void Attach(Element *pElement){
         elements.push_back(pElement);
    }
 
     void Detach(Element *pElement)   
    {
 
         vector<Element *>::iterator it = find(elements.begin(), elements.end(), pElement);
         if (it != elements.end())
         {
              elements.erase(it);
         }
    }
 
     void Accept(Visitor *pVisitor){
     // 為每一個element設置visitor,進行對應的操作
         for (vector<Element *>::const_iterator it = elements.begin(); it != elements.end(); ++it)
         {
              (*it)->Accept(pVisitor);
         }
 
}
 
int main()
{
     //實例化對象結(jié)構,用于存放元素對象,提供遍歷其內(nèi)部元素的方法
     ObjectStructure *pObject = new ObjectStructure;
      //實例化具體元素 并將創(chuàng)建好的元素放入對象結(jié)構中
     ConcreteElementA *pElementA = new ConcreteElementA;
     ConcreteElementB *pElementB = new ConcreteElementB;
     pObject->Attach(pElementA);
     pObject->Attach(pElementB);
     //實例化訪問者                                                                                                                      
     ConcreteVisitor1 *pVisitor1 = new ConcreteVisitor1;
     ConcreteVisitor2 *pVisitor2 = new ConcreteVisitor2;
     //調(diào)用accept方法 來接受訪問者對象的訪問
     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;
}

參考文獻:

【1】訪問者模式(c++實現(xiàn)):訪問者模式(c++實現(xiàn))

【2】C++設計模式之訪問者模式: http://m.fzitv.net/article/55999.htm

到此這篇關于C++實現(xiàn)訪問者模式的文章就介紹到這了,更多相關C++訪問者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言計算分段函數(shù)問題

    C語言計算分段函數(shù)問題

    這篇文章主要介紹了C語言計算分段函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++深入分析講解鏈表

    C++深入分析講解鏈表

    當我們在寫一段代碼時,如果要頻繁的在一塊區(qū)域進行插入或者刪除操作時,會發(fā)現(xiàn)用數(shù)組實現(xiàn)會比較復雜,這時候我們就要用另一種數(shù)據(jù)結(jié)構,鏈表來實現(xiàn)
    2022-06-06
  • C++ std:map的使用方法

    C++ std:map的使用方法

    std::map是C++標準庫中一個強大而高效的關聯(lián)容器,本文就來介紹一下C++ std:map的使用方法,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • C語言中的數(shù)據(jù)類型詳解

    C語言中的數(shù)據(jù)類型詳解

    在C語言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個廣泛的系統(tǒng)。變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式,本文將詳細給大家介紹一下C語言中的基本數(shù)據(jù)類型,感興趣的同學可以參考下
    2023-05-05
  • C++封裝靜態(tài)鏈接庫和使用的詳細步驟

    C++封裝靜態(tài)鏈接庫和使用的詳細步驟

    這篇文章主要介紹了C++封裝靜態(tài)鏈接庫和使用,本文描述了怎么去把一個C++程序封裝成一個靜態(tài)庫并且如何去使用這些靜態(tài)庫,需要的朋友可以參考下
    2022-08-08
  • MFC對話框中添加狀態(tài)欄的方法

    MFC對話框中添加狀態(tài)欄的方法

    這篇文章主要介紹了MFC對話框中添加狀態(tài)欄的方法,實例分析了MFC對話框添加狀態(tài)欄所涉及的相關成員變量與事件實現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • C++關于指針,繼承和多態(tài)介紹

    C++關于指針,繼承和多態(tài)介紹

    大家好,本篇文章主要講的是C++關于指針,繼承和多態(tài)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • CFileDialog設置多選的問題解決

    CFileDialog設置多選的問題解決

    前幾天同事問我在CFileDialog中多選時按確定按鈕后DoModal函數(shù)的返回值是IDCANCEL的問題解決
    2013-02-02
  • OPENMP?SECTIONS?CONSTRUCT原理示例解析

    OPENMP?SECTIONS?CONSTRUCT原理示例解析

    這篇文章主要為大家介紹了OPENMP?SECTIONS?CONSTRUCT原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • C++實現(xiàn)Dijkstra算法的示例代碼

    C++實現(xiàn)Dijkstra算法的示例代碼

    迪杰斯特拉算法(Dijkstra)是由荷蘭計算機科學家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個頂點到其余各頂點的最短路徑算法。本文將用C++實現(xiàn)Dijkstra算法,需要的可以參考一下
    2022-07-07

最新評論

闻喜县| 绍兴市| 唐山市| 济源市| 博客| 金门县| 花莲市| 醴陵市| 遵化市| 二连浩特市| 伊吾县| 呈贡县| 茶陵县| 西乌珠穆沁旗| 斗六市| 通化县| 融水| 宝山区| 建湖县| 右玉县| 海南省| 河池市| 兴文县| 遵化市| 钟山县| 汉中市| 红桥区| 宜宾县| 横山县| 台南县| 巴楚县| 汾西县| 滨海县| 穆棱市| 富阳市| 宕昌县| 长海县| 昌平区| 大同市| 深泽县| 永胜县|