2015-04-12 106 views
4

我使用訪客設計模式來解決我們系統中的問題之一。作爲參考如何實現它我使用DoFactory siteThis YouTube video訪客設計模式 - 返回類型

在DoFactory示例中,訪客使用返回類型爲「void」的方法,在YouTube視頻中,作者使用「double」。

爲什麼我問:
呈現解決方案公司CTO之後,他接受叫它觀衆,但他聲稱一樣,如果遊客不「空」像濫用真正的觀衆在GoF的規定,比模式。

問題:
訪客模式是否需要返回「void」?
我的意思是爲了成爲DoFactory(GoF)描述的「真正的訪問者模式」,或者它可以是任何返回類型,仍然可以稱爲「真實訪問者模式」?

+1

很高興知道* other *作者爲什麼選擇返回double而不是nothing的原因('void');然後分析這些原因在這種情況下是否有效。大多數時候,談論純粹的這種或那種模式是種反作用的。只要使用最適合你的方式爲你工作;不要太擔心該怎麼稱呼它。如果你打電話給那些*訪問者模式*,大多數人仍然會同意並理解你在說什麼:首先這是主要目標。讓我們看看...定義「真實」。 – Leandro

+1

我寫了一個[關於Programmers.SE]的答案(http://programmers.stackexchange.com/a/313903/60357),觸及了這一點。簡而言之,GoF設計模式書的字面意思是包含返回任意對象的示例代碼。這在很大程度上被忽略了,因爲該代碼使用動態類型在Smalltalk中。 C++示例代碼必須使用void,因爲該語言的語義限制,而不是因爲void返回類型是訪問者模式的核心功能。在Java中,我們可以以類型安全的方式使用非泛型返回類型的泛型。 – amon

回答

5

設計模式旨在用來指導如何解決常見的計算機科學問題。歡迎您以任何您希望的方式偏離「真實」實施。

至於您的示例youtube視頻,其作者展示瞭如何使用訪問者模式來計算不同類型項目的稅收。每個visit方法返回了包含每個項目將花費的稅金的金額的兩倍。然後制定不同的訪客實施方案,以顯示如何在不更改代碼的情況下計算稅金(正常稅收假期等)。

這個例子是一個「玩具」問題,目的是教導訪問者模式如何以一種容易理解的方式工作,並且它做得很好。

雖然我說歡迎您偏離GoF的實現,但從模擬此視頻的代碼可能不是一個好主意。 視頻中有幾件事情在真實程序中使用是一個壞主意。例如使用double作爲金錢。我認爲回報雙倍(金錢)只是一種快速顯示訪問者工作方式的方法,您可能不應該使用它。

如果您想修改視頻中的代碼,則返回void。最簡單的解決方案是在TaxVisitor中有一個專用字段,用於累計總值並在每個訪問方法中增加它。然後有一個getter來獲得最終總數。

作者還明確地調用了他的訪客示例中的每個食物項目,該示例沒有展示Visitor Pattern的威力。我會有一個雜貨物品的容器物品,這些物品是可見的,並且其接受方法將訪問收據中的每個物品。

GroceryList groceries = new GroceryList(); 

groceries.add(new Milk(...)); 
groceries.add(new Liquor(...)); 
    ... 


TaxVisitor visitor = new TaxVisitor(); 

visitor.accept(groceries); 


Money tax = visitor.getTax(); 

Money preTaxTotal = groceries.getTotalPreTax(); 

Money total = preTaxTotal.plus(tax); 

//or compute tax during tax holiday 
TaxVisitor holidayVisitor = new TaxHolidayVisitor(); 
    holidayVisitor.accept(groceries); 


Money holidayTax = holidayVisitor.getTax(); 

    Money holidayTotal = preTaxTotal.plus(holidayTax); 
+0

非常有幫助的解釋。我知道關於金錢問題的「雙重」,這只是我的問題。謝謝! –