設計模式筆記16 訪問者模式(visitor)

2021-09-29 23:29:15 字數 1731 閱讀 3396

完成測評系統需求

1) 將觀眾分為男人和女人,對歌手進行測評,當看完某個歌手表演後,得到他們對該歌手不同的評價(評價 有不同的種類,比如 成功、失敗 等)

傳統方式的問題分析

1) 如果系統比較小,還是ok的,但是考慮系統增加越來越多新的功能時,對**改動較大,違反了ocp原則, 不利於維護

2) 擴充套件性不好,比如 增加了 新的人員型別,或者管理方法,都不好做

3) 引出我們會使用新的設計模式 – 訪問者模式

訪問者模式基本介紹

1) 訪問者模式(visitor pattern),封裝一些作用於某種資料結構的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。

2) 主要將資料結構與資料操作分離,解決 資料結構和操作耦合性問題

3) 訪問者模式的基本工作原理是:在被訪問的類裡面加乙個對外提供接待訪問者的介面

4) 訪問者模式主要應用場景是:需要對乙個物件結構中的物件進行很多不同操作(這些操作彼此沒有關聯),同時需要避免讓這些操作"汙染"這些物件的類,可以選用訪問者模式解決

訪問者模式的原理類圖

對原理類圖的說明-即(訪問者模式的角色及職責)

1) visitor 是抽象訪問者,為該物件結構中的concreteelement的每乙個類宣告乙個visit操作

2) concretevisitor :是乙個具體的訪問值 實現每個有visitor 宣告的操作,是每個操作實現的部分.

3) objectstructure 能列舉它的元素, 可以提供乙個高層的介面,用來允許訪問者訪問元素

4) element 定義乙個accept 方法,接收乙個訪問者物件

5) concreteelement 為具體元素,實現了accept 方法

核心**:

public static void main(string args)

objectstructure.display(success);這一句:

public void display(action action)

}即為對資料結構中的所有佇列進行遍歷,並設定操作,accept的操作如下:

@override

public void accept(action action)

然後通過action來進行操作,可以看出來諸如success類是可以新增的,而不影響原有的objecture。

應用案例的小結

-上面提到了雙分派,所謂雙分派是指不管類怎麼變化,我們都能找到期望的方法執行。雙分派意味著得到執行的操作取決於請求的種類和兩個接收者的型別

- 以上述例項為例,假設我們要新增乙個wait的狀態類,考察man類和woman類的反應,由於使用了雙分派,只需增加乙個action子類即可在客戶端呼叫即可,不需要改動任何其他類的**。

訪問者模式的注意事項和細節

優點1) 訪問者模式符合單一職責原則、讓程式具有優秀的擴充套件性、靈活性非常高

2) 訪問者模式可以對功能進行統一,可以做報表、ui、***與過濾器,適用於資料結構相對穩定的系統

缺點1) 具體元素對訪問者公布細節,也就是說訪問者關注了其他類的內部細節,這是迪公尺特法則所不建議的, 這樣造成了具體元素變更比較困難

2) 違背了依賴倒轉原則。訪問者依賴的是具體元素,而不是抽象元素

3) 因此,如果乙個系統有比較穩定的資料結構,又有經常變化的功能需求,那麼訪問者模式就是比較合適的.

設計模式筆記 訪問者模式

訪問者模式 表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。visitor類,為該物件結構中concretevisitor的每乙個類宣告乙個visit操作。訪問者介面為使用不同演算法的子類宣告訪問操作。public abstract clas...

設計模式筆記 訪問者模式

封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。visitor 抽象訪問者 抽象類或介面,宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的 public inte ce ivisitorvisitor ...

23種設計模式(16) 訪問者模式

定義 封裝某些作用於某種資料結構中各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。型別 行為類模式 類圖 訪問者模式可能是行為類模式中最複雜的一種模式了,但是這不能成為我們不去掌握它的理由。我們首先來看乙個簡單的例子,如下 class a public void metho...