設計模式利劍19 訪問者模式

2021-05-22 14:36:22 字數 1201 閱讀 1552

目      的:封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。

定      義:封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作

優      點:

1. 訪問者模式使得增加新的操作變得很容易。如果一些操作依賴於乙個複雜的結構物件的話,那麼一般而言,增加新的操作會很複雜。而使用訪問者模式,增加新的操作就意味著增加乙個新的訪問者類,因此,變得很容易。

2. 訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。

3. 訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。迭代子只能訪問屬於同乙個型別等級結構的成員物件,而不能訪問屬於不同等級結構的物件。訪問者模式可以做到這一點。

4. 積累狀態。每乙個單獨的訪問者物件都集中了相關的行為,從而也就可以在訪問的過程中將執行操作的狀態積累在自己內部,而不是分散到很多的節點物件中。這是有益於系統維護的優點

缺      點:

1. 增加新的節點類變得很困難。每增加乙個新的節點都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作。

2. 破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每乙個節點物件的操作,這隱含了乙個對所有節點物件的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的訪問就變得沒有意義。由於訪問者物件自己會積累訪問操作所需的狀態,從而使這些狀態不再儲存在節點物件中,這也是破壞封裝的

應用場景:

1:資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。

2:被訪問的類結構非常穩定的情況下使用。系統很少出現需要加入新節點的情況。如果出現需要加入新節點的情況,那麼就必須在每乙個訪問物件裡加入乙個對應於這個新節點的訪問操作,而這是對乙個系統的大規模修改,因而是違背"開一閉"原則的。

應用案例:

先來看看uml圖如下:

concretevisitor:具體訪問者,它影響訪問者訪問到乙個類後該怎麼幹,要做什麼事情

element:抽象元素,介面或者抽象類,宣告接受那一類訪問者訪問,程式上是通過accept中的引數來決定

objectstruture:結構物件,一般容納在多個不同類,不同介面的容器,如arraylist

先來看乙個例子,要列印所有員工的工作資訊,員工包括管理人員與普通員工,實現uml圖如下:

設計模式 訪問者模式

訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...

設計模式 訪問者模式

訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...

設計模式 訪問者模式

在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。1 符合單一職責原則。2 優秀...