2012-06-28 32 views
1

我沒有看到任何區別。看起來兩個模式都在嘗試組合對象。任何人都可以解釋這兩種模式背後的意圖嗎?訪客和複合模式之間的區別?

+2

你至少在搜索「訪客模式」和「複合模式」?兩者都導致維基百科的完整說明頁面。 –

回答

5

他們是不同的模式,但他們經常一起使用。

複合的要點是將相同的操作應用於共享接口的一組元素。訪問者的要點是用一個新的操作擴展一堆元素,而不改變它們的實現,也不用調用者的實現。因此,你經常會看到:

Composite c = new Composite(); 
Visitor v = new ConcreteVisitor(); 
c.visit(v); 

這樣你就可以保持組合的實現,並且是在複合靜態類,只有改變你對他們適用的那種觀衆的。

7

這些模式是完全不同!首先複合是一個structural patterns,這意味着它被用來構建數據結構。 訪客behavioral pattern,負責關係和行爲。

若要進一步解釋它,請使用Composite來構建對象樹,其中所有項都是T的子類型。然而,T(容器的種類)的一個子類可以容納子集合T。考慮一個類Item比有兩個子類:ProductBoxBox可以進一步持有Item的產品或箱子。這些嵌套的框可以保留更多的項目,所以我們正在有效地構建一個樹狀結構。

訪問者用於仿真虛擬呼叫以避免類似instanceof的結構。完整的示例請參見Is This Use of the "instanceof" Operator Considered Bad Design?訪問者可以與複合一起使用 - 就像上面的示例中一樣,如果Item定義了accept(ItemVisitor visitor)方法,則可以遍歷樹。

我發現很難看到這兩者之間有任何相似之處。

1

複合是一個對象,它有一組操作和一個對象本身的容器。該容器可能包含或不包含對象。在Composite上執行的操作將在其本身及其包含的所有對象上執行。有些人可能把這稱爲一種樹。

訪問者是一組對象/操作,它們在已建立的類的層次結構上工作。 Visitor允許您在層次結構上創建操作,而無需更改層次結構。一個例子是創建一個操作(訪問)層次結構中的多個對象,從而將多個對象的工作組合在一起,而無需更改其接口。

這兩種模式確實完全不同。

相關問題