行為型模式十九 訪問者模式(Visitor)

2021-08-03 01:29:03 字數 1796 閱讀 8261

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。

表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。

1.visitor 抽象訪問者角色,為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定介面直接訪問它。

2.concretevisitor.具體訪問者角色,實現visitor宣告的介面。

3.element 定義乙個接受訪問操作(accept()),它以乙個訪問者(visitor)作為引數。

4.concreteelement 具體元素,實現了抽象元素(element)所定義的接受操作介面。

5.objectstructure 結構物件角色,這是使用訪問者模式必備的角色。它具備以下特性:能列舉它的元素;

可以提供乙個高層介面以允許訪問者訪問它的元素;如有需要,可以設計成乙個復合物件或者乙個聚集(如乙個列表或無序集合)。

訪問者模式主要由三個角色組成

訪問者

訪問元素

元素集合(可以不是物件)

訪問者就是對訪問元素進行操作的訪問物件。有可以對訪問元素操作的方法。

訪問元素即可以執行動作的物件。是可以被訪問者修改的物件。

元素集合則顧名思義是訪問元素的集合,將訪問元素放到元素集合當中,等待訪問。

以遊戲而言,有許多種建築物,居民樓、教堂、兵營等,這些都是訪問元素,而訪問者有清潔工、廚師等。整個遊戲就是元素集合。

清潔工可以提公升三者的清潔度,並且會提高居民樓的舒適度,教堂的信仰度,兵營的訓練熱情度等(想想看髒亂不堪的和乾淨整潔的區別);

廚師可以提公升三者的幸福感(有好吃的總會讓人感到幸福),並且會提高教堂的人氣值,兵營的士氣值;

這時候增加了一種訪問者:客人

客人可以提公升居民樓和教堂的人氣值,教堂的傳播度,兵營不允許訪問。

這個時候通過有兩種選擇:

在居民樓、教堂、兵營等所有類中實現訪問者能實現的事情,當增加訪問者的時候則所有的訪問元素類都需要進行修改

將訪問者抽象出來,實現訪問者模式,當增加訪問者的時候,增加乙個訪問者類並實現對應方法即可

定義訪問元素,包括抽象物件與具體物件。

定義訪問者,在抽象物件中訪問者定義執行動作,訪問元素中接收訪問者的方法。

訪問元素增加 acceptvisitor(visitor) 方法(接收訪問者),訪問者增加 visita(a)、visitb(b)、visitc(c) 方法(根據元素物件的多少)

通過訪問元素呼叫訪問者中的事件。在訪問元素的 acceptvisitor 的實現方法中呼叫 [visitor visitx:self] 執行方法。

訪問者模式屬於方法的擴充套件。優點如下:

在不同的物件中,如果存在大量重複的**,可以把**封裝到訪問者中。降低**的冗餘度。

易於增加訪問者,通過訪問者實現不同的方法。在不更改訪問元素結構的前提下增加實現的方法。

不過同時也有乙個很嚴重的缺點:

如果增加了一種訪問元素,那麼所有的訪問者都需要增加對應的方法,導致增加訪問元素的成本增加。

所以,最好在能確定具體元素數量的時候再使用訪問者模式。

行為型模式 訪問者模式

在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。主要將資料結構與資料操作分離。...

行為型模式 訪問者模式

在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。意圖 主要將資料結構與資料操作...

行為型模式 訪問者模式

定義 目的時封裝一些施加於某些資料結構元素之上的操作,一但這些操作需要修改,接受這些操作的資料結構則可以保持不變。角色 抽象訪問者 定義cpu和硬碟的訪問 屬性 具體訪問者 實現訪問 硬體型別和執行 抽象元素 定義硬體型號,運轉,訪問 引數 抽象訪問者 具體元素 實現cpu和硬碟的抽象方法 結構物件...