終於到最後乙個模式了,
意圖:
表示乙個作用於某物件結構中的各元素的操作。它使你可以再不改變各元素的類的前提下定義作用於這些元素的新操作。
動機:
使用visitor
模式,必須定義兩個類層次:乙個對應於接受操作的元素,另乙個對應於定義對元素的操作的訪問者(
visitor
)。給訪問者類層次增加乙個新的子類即可建立乙個新的操作。
適用性:
1 乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。 2
需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。
visitor
可以將相關的操作集中起來定義在乙個類中。當該物件結構被很多應用共享時,用
visitor
模式讓每個應用僅包含需要用到的操作。 3
定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,需要很大的代價。如果物件結構類經常改變,那就在類中定義操作,不使用
visitor
結構:
參與者:
visitor
(訪問者)
:為該物件結構中
concreteelement
的每乙個類宣告乙個
visit
操作。該操作的名字和特徵標識了傳送
visist
請求給訪問者的那個類。使得訪問者可以確定正被訪問元素的具體的類。訪問者可以通過該元素的特定介面直接訪問它。
concrete
visitor(
具體訪問者):
實現每個由
visitor
宣告的操作。每個操作實現本演算法的一部分,該演算法片段式對應於結構中物件的類。
concrete
vistor
為該演算法提供了上下文並儲存它的區域性狀態。
element(元素
):定義乙個
accept
操作,以乙個訪問者為引數。
concreteelement(
具體元素):
實現accept
操作,該操作以乙個訪問者為引數。
objectstructure(
物件結構):
能列舉它的元素;可以提供乙個高層的介面以允許該訪問者訪問它的元素;
可以是乙個復合或是乙個集合,如乙個列表或乙個無序集合。
協作:
1 乙個使用
visitor
模式的客戶必須建立乙個
concretevistor
物件,然後遍歷該物件結構,並用該訪問者訪問每個元素。 2
當乙個元素被訪問時,它呼叫對應於它的類的
visitor
操作。如果必要,該元素將自身作為這個操作的乙個引數以便該訪問者訪問它的狀態。
如下圖所示:
效果:
1 訪問者模式使得易於增加新的操作:僅需增加乙個新的訪問者即可在乙個物件結構上定義乙個新的操作。相反,如果每個功能都分散在多個類的話,定義新的操作必須修改每個類。 2
訪問者集中相關的操作而分離無關的操作:相關的行為集中在乙個訪問者中,無關行為卻被分別放在各自的訪問者子類中。 3
增加新的
concrete
element
類很困難:該模式使得難以增加新的
element
的子類。 4
通過類層次進行訪問
:訪問者可以訪問具有不同父類的物件。 5
累積狀態:當訪問者訪問物件結構中的每個元素時,它可能會累積狀態。 6
破壞封裝:通常需要提供訪問元素內部狀態的公共操作,可能會破壞封裝性。
實現:每乙個物件結構將有乙個相關的
visitor
類。抽象的訪問者類為定義物件結構的每乙個
concreteelement
類宣告乙個
visitconcreteelement
操作。每乙個
visitor
上的visit
操作宣告它的引數為乙個特定的
concreteelement
,以允許該
visitor
直接訪問
concreteelement
的介面。
concretevisitor
類重定義每乙個
visit
操作,從而為相應的
concreteelement
類實現與特定訪問者相關的行為。 每個
concreteelement
類實現乙個
accept
操作,這個操作呼叫訪問者中相應於本
concreteelement
類的visit
操作。這樣最終得到呼叫的操作不僅依賴於該元素的類也依賴於訪問者的類。 1
雙分派:得到執行的操作決定於請求的種類和兩個接受者的型別。
accept
是乙個double-dispatch
操作。含義決定於兩個型別:
visitor
的型別和
element
的型別。雙分派使得訪問者可以對每個類的元素請求不同的操作。
關鍵就是:得到執行的操作不僅決定於
visitor
的型別還決定於它訪問的
element
的型別。 2
誰負責遍歷物件結構:通常由物件結構負責迭代。乙個集合對它的元素進行迭代,並對每乙個元素呼叫
accept
操作。
相關模式:
composite:
訪問者可以用於對乙個由
composite
模式定義的物件結構進行操作
interpreter:
訪問者可以用於解釋
以下為大話上的例子、、
//訪問者模式
#include #include using namespace std;
class man;
class woman;
//狀態的抽象類,相當於visitor
class action
virtual void getmanconclusion(man& concreteelementa) = 0;
virtual void getwomanconclusion(woman& concreteelementb) = 0;
};//人的抽象類,相當於element
class person
virtual void accept(action& visitor) = 0;
};//男人
class man : public person
};//女人
class woman : public person
};//具體「狀態」類
class success : public action
void getwomanconclusion(woman& concreteelementb) };
//失敗
class failing : public action
void getwomanconclusion(woman& concreteelementb) };
//戀愛
class amativeness: public action
void getwomanconclusion(woman& concreteelementb) };
//物件結構
class objectstructure
void detach(person& element)
void display(action& visitor) }
private:
listelements;
};int main()
行為型模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。主要將資料結構與資料操作分離。...
行為型模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。意圖 主要將資料結構與資料操作...
行為型模式 訪問者模式
定義 目的時封裝一些施加於某些資料結構元素之上的操作,一但這些操作需要修改,接受這些操作的資料結構則可以保持不變。角色 抽象訪問者 定義cpu和硬碟的訪問 屬性 具體訪問者 實現訪問 硬體型別和執行 抽象元素 定義硬體型號,運轉,訪問 引數 抽象訪問者 具體元素 實現cpu和硬碟的抽象方法 結構物件...