設計模式學習(二十二) Visitor

2021-09-28 21:10:33 字數 794 閱讀 6740

這一篇部落格主要記錄了visitor(訪問器)模式的學習,visitor模式和前面學習的command模式同樣屬於「行為變化」模式。

在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增加新的行為(方法),如果直接在基類中做這樣的更改,將會給子類帶來很繁重的變更負擔,甚至破壞原有設計。

如何在不更改類層次結構的前提下,在執行時根據需要透明地為類層次結構上的各個類動態新增新的操作,從而避免上述的問題?

表示乙個作用於某物件結構中的各元素的操作,使得可以在不改變(穩定)各元素的類的前提下定義(擴充套件)作用於這些元素的新操作(變化)。

圖中紅色部分為穩定的部分,藍色部分為變化的部分。

visitor模式有乙個很大的侷限性:element類的子類個數必須是穩定的,並且visitor模式中的方法數需要和element類的子類個數相同。

visitor模式通過所謂雙重分發(double dispatch)來實現在不更改(不新增新的操作-編譯時)element類層次結構的前提下,在執行時透明地為類層次結構上的各個類動態新增新的操作(支援變化)。

所謂雙重分發即visitor模式中間包括了兩個多型分發(注意其中的多型機制):第乙個為accept方法的多型辨析;第二個為visitelementx方法的多型辨析。

visitor模式的最大缺點在於擴充套件類層次結構(增添新的element子類),會導致visitor類的變化。因此visitor模式適用於「element類層次結構穩定,而其中的操作卻經常面臨頻繁改動」。

設計模式(二十二) 策略模式

有時候物件需要按照某種策略改變行為,我們可以利用策略模式,將策略或演算法提取出來,作為單獨的類實現。使用策略模式,可以讓具體演算法和應用物件分離,方便的根據不同條件替換策略。下面舉乙個例子。我們有乙個計算器,它會按照快和慢兩種策略來計算結果。所以我們可以將策略封裝起來。public inte ce ...

設計模式(二十二)模板模式

在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。意圖 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構...

狀態模式 java設計模式(二十二)

共享狀態 優缺點和適用範圍 jdk中的應用 狀態模式 state pattern 允許乙個物件在內部狀態改變時改變行為,看起來似乎修改了類。狀態模式結構。狀態轉換可以由環境類統一負責。新增具體狀態需要修改環境類。public void changestate else if value 1 publ...