設計模式 訪問者 Visitor 模式

2021-09-01 15:27:38 字數 2553 閱讀 6829

from:

參考:

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

第一次這句話時,著實費解。關於對訪問者模式的理解,可以先見下面這個例子,而後再看最後的綜述。

比如:你下午請客喝東西,那麼就的考慮好你請的這些人中總會有口味不同,有些人喜歡喝茶,有些人喜歡喝果汁,有人喜歡喝咖啡。你當然只有把這些東西都準備好,盡量準備得全一些。那麼來的客人喜歡喝啥就自己拿就是了。

那麼我們定義乙個基本的訪問者操作的介面,反正你也不曉得要來的客人喜歡喝什麼,那麼就抽象乙個visitor什麼都喝。

//基本訪問著的操作

public inte***ce visitor

這時,你的需要準備好要喝的東西來招待你的客人,定義乙個方法的介面,不管是什麼水,反正用來招待客人。

public inte***ce water
此外,你得把具體得水準備好了,準備好三樣:茶、咖啡、果汁。不同型別的水也許會有各自的一些屬性操作等等。

public class teawater implements water 

public string gethottea()

public string getcoldtea()

}

public class caffeewater implements water 

public void addsugar(int number)

}

public class juicewater implements water 

public string getjuice(int size)

}

我們再假設幾個訪問者實體類,假設zhangsan   lisi 就是你要邀請的兩個人,他們的喜好定義如下:

public class zhangsanvisitor implements  visitor

@override

public void visit(juicewater juicewater)

@override

public void visit(caffeewater caffeewater)

}

public class lisivisitor implements visitor 

@override

public void visit(juicewater juicewater)

@override

public void visit(caffeewater caffeewater)

}

好了,接下來就是準備工作啦。你的把桌子準備好,用於放要喝的東西,招待客人。

public class table 

//招待客人

public void accept(visitor visitor)}}

萬事具備,客人來了,我們寫個測試方法。準備好茶、咖啡、果汁來招待zhangsan、lisi。

@test

public void test01()

執行結果如下:

以上就是乙個訪問者模式的基本例項。

關於訪問者模式的uml圖,可參見如下:

根據之前例子,可看到,對於訪問者模式而言,兩個最重要的角色:

訪問者角色(visitor):宣告了乙個或者多個訪問操作,也就是說,該訪問者需要做哪些操作;

節點角色(element): 也就是water這個介面的,它宣告乙個接受操作,接受乙個訪問者物件作為乙個參量,也就是說,當訪問者到來時,需要怎麼做。

針對節點角色於訪問者角色的方法可看到,節點角色接收乙個訪問者物件,並把自己作為變數再傳給訪問者物件,訪問者物件再呼叫節點物件裡的邏輯方法,這種操作過程被稱為「雙重分派」。

此外,對於table這個物件,就是訪問者模式的結構物件角色(objectstructure),它就是用於遍歷節點中的所有元素。

可以看出,訪問者模式適合於操作相對穩定的結構,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。也就是說,對於乙個visitor,它需要有什麼操作,必須要非常清楚。如之前的例子,我招待客人,那麼我很清楚,我只有茶、咖啡、果汁這個材料,我也只能拿這三個來招待客人。所以在visitor方法中,就只有那三個方法。這是訪問者模式最重要的一點,也是最有缺陷的一點。 如上個例子:有個人還想喝酒,我還得新增加乙個節點類,及water實現類,那麼我還得在visitor中加入乙個方法,改動所有的visitor的實現類,很明顯,這樣的效率是非常低下的。

但是對於增加新的訪問者那就非常的簡單,如上的例子,無非就是多來乙個客人,也就是新增加乙個新visitor實現類。

所以,訪問者適用於具體操作能夠非常穩定的情景下,能夠很容易的拓展訪問者(visitor)。

訪問者設計模式Visitor

各個元件可對訪問者暴露自己的細節 訪問者拿著細節去做不同的事情,這些事情是和元件本身可能並無緊密關聯的 將資料結構和資料操作分離 資料結構和資料操作耦合的問題 訪問者模式的應用場景一般需要具備兩個條件 相對穩定的被訪問者,如資料結構 工具 元件等,自身具備足夠的屬性和基礎能力 相對靈活可變 不確定的...

設計模式 訪問者模式 Visitor

visitor模式表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。類圖 乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作...

設計模式 訪問者模式 Visitor

乙個觀察者,訪問兩個element,concreteelementa 和 concreteelementb,concreteelementa 只有name屬性,所以訪問它是只展示name值,concreteelementb除了name之外,還具有乙個綽號nickname屬性,所以訪問它要展示兩個屬性...