2012-11-28 45 views
10

我已經學會了兩種模式,但並不瞭解這兩種模式之間的差異。訪客和策略模式有什麼區別?

我不知道的情況,何時何地使用這些模式。

任何一個可以解釋的差異和使用情況?

+3

這是與不同模式相關的好方法:http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

尼斯鏈接@ jco.owens! –

+0

現在鏈接已損壞..你可以更新@ jco.owens嗎? – Joe

回答

3

訪問者模式用於遍歷對象分層結構並提供類似印刷或報告等一些功能,我用此來提供不同的格式(文本/ HTML)通過寫入多個訪問者打印的對象分層結構,每一個格式。層次結構中的對象是可見的。

策略模式被用於挑選基於所述輸入一個特定的邏輯路徑。一個典型的例子是身份驗證過濾器,其中基於Authorization HTTP標頭中的值,挑選並運行不同的身份驗證策略(如NTLM/Negotiate/Basic)。該過濾器將舉行一個參考AuthenticationStrategy接口,基於傳入請求,特定的身份驗證策略是挑選和分配給該參考和遵循並不需要知道所使用的確切策略的代碼。

+1

策略模式的一個簡單示例 - 使用Comparator的不同實現來對列表進行不同的排序? – Scorpion

15

的主要區別在於,策略模式封裝相關行爲的一個組,而訪問者模式封裝多個這樣的基團。如果你有一個家庭的算法,你需要在運行時它們之間選擇,你應該使用策略模式 -

  • 當你需要封裝行爲您應該使用策略模式。這很常見:每當你發生這種事情時program to an interface
  • 您應該使用訪問者模式實施雙重分派 - 如果你有一組需要在關係虛擬到多個對象的算法。這種情況遠不那麼普遍,部分原因是實施起來難度較大。
+2

+1,你可以通過例子來了解更多細節,但這是一個令人討厭的簡潔答案。 – Scorpion

+0

@dasblinkenlight您能詳細說明您的意思嗎?「如果您有一組算法需要對多個對象進行虛擬化。」 – Geek

+0

@Geek經典的例子是表達式樹。一方面,您有一組類遵循複合模式(基本表達式,常量表達式,二進制表達式,函數調用等)。另一方面,您有一組實現算法的類(轉換爲XML,打印到文本文件,評估等)。因此,您要調用的方法取決於表達式**的子類型和算法的子類型,因此行爲對於多個類是虛擬的。它的正式名稱是[* double dispatch *](http://en.wikipedia.org/wiki/Double_dispatch)。 – dasblinkenlight

2

訪問者模式意圖:

代表的操作上的對象結構的元件來執行。訪問者可以讓你定義一個新的操作而不需要改變它所操作的元素的類。

如果使用Visitor模式:

  1. 類似的操作都必須在一個結構分爲不同類型的對象進行
  2. 您需要執行很多不同的和無關的操作。它從物體結構分離操作
  3. 新業務必須添加沒有對象結構變化
  4. 收集相關操作成一個類而不是強迫你改變或派生的類
  5. 添加功能到您的或者沒有源文件或無法更改源文件的類庫

即使訪問者輕拍tern提供了增加新操作的靈活性,而無需更改Object中現有的代碼,這種靈活性帶來了一個缺點。

如果添加了新的Visitable對象,它需要對Visitor & ConcreteVisitor類中的代碼進行更改。解決此問題的方法是:使用反射,這會影響性能。

參考oodesign articlesourcemaking文章瞭解更多詳情

策略模式的意圖:

定義一系列的算法,封裝每一個,使得它們可以互換。策略可以讓算法獨立於使用它的客戶端。

策略可讓您更改對象的內臟。

請參閱以下SE問題,瞭解更多詳情:

Real World Example of the Strategy Pattern

0

除了上面提到的行爲差異,我也經歷了關於相關性的差別和項目中使用的情況下,一旦我工作,如下所示。

例如,訪問者知道具體的類。因此,當您向層次結構中添加新的具體類時,您將更加靈活,但需要更改訪問者代碼。 Strategy中沒有這樣的事情。在這種情況下,如果您僅使用給定輸入返回某些輸出的方法,則無論上下文如何,Strategy都會變得更加合適。

此外,Visitor模式還用於實現SOLID的SRP,以分離關注點。

0

訪問者適用於當你有一個類的家庭,你需要添加新的功能,該系列的每個類,但不觸及類本身(或希望有一個新的功能都在一個地方定義 - - 訪問者)

策略適用於當您有一系列類需要能夠做某些事情才能正常工作(例如對它們包含的某些對象進行排序),但您希望客戶端或您的依賴注入告訴他們該怎麼做。

相關問題