設計模式旨在用來指導如何解決常見的計算機科學問題。歡迎您以任何您希望的方式偏離「真實」實施。
至於您的示例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);
很高興知道* other *作者爲什麼選擇返回double而不是nothing的原因('void');然後分析這些原因在這種情況下是否有效。大多數時候,談論純粹的這種或那種模式是種反作用的。只要使用最適合你的方式爲你工作;不要太擔心該怎麼稱呼它。如果你打電話給那些*訪問者模式*,大多數人仍然會同意並理解你在說什麼:首先這是主要目標。讓我們看看...定義「真實」。 – Leandro
我寫了一個[關於Programmers.SE]的答案(http://programmers.stackexchange.com/a/313903/60357),觸及了這一點。簡而言之,GoF設計模式書的字面意思是包含返回任意對象的示例代碼。這在很大程度上被忽略了,因爲該代碼使用動態類型在Smalltalk中。 C++示例代碼必須使用void,因爲該語言的語義限制,而不是因爲void返回類型是訪問者模式的核心功能。在Java中,我們可以以類型安全的方式使用非泛型返回類型的泛型。 – amon