2013-03-13 83 views
6

我正在爲我的OOP課程的規範建立一個機票預定系統。系統必須用C#編寫。我想知道什麼是解決以下問題的最佳方法:有條件預訂系統的最佳設計模式

該公司目前運營折扣方案。 Western Isles居民可享受10%的折扣。 斯科舍還記錄這些乘客的居住島爲營銷目的。商務 旅客得到25%的折扣,並且必須提供他們的公司名稱。普通乘客不需要 通常會獲得折扣,除非它是當前促銷活動的一部分,在這種情況下,他們會收到5%的折扣 。

我應該有一個乘客艙,每個單獨類型的客戶從哪裏繼承?任何幫助,將不勝感激

+0

如果乘客可以獲得多種折扣,我可能也會使用裝飾者,是這樣嗎? – 2013-03-13 09:22:04

+0

嗨,本傑明。每位客戶只能收到其中一種可用的折扣。謝謝。 – 2013-03-13 09:24:06

+0

您的描述是否意味着乘客可以獲得多種折扣?由於居住*和業務的25%,因此10%?如果是這樣,我想每個折扣一個派生類是行不通的。在現實世界的場景中,我會考慮一些簡單的if語句,因爲引入完整的模式似乎被過度工程化。然而,如果它是功課並且想要炫耀,也許你可以找到更適合「許多折扣」要求的產品。 – nvoigt 2013-03-13 09:24:07

回答

7

在我看來,你希望從乘客繼承。繼承意味着對象在某種程度上發生了變化,但無論他獲得多少折扣,乘客都是乘客。換句話說,他的功能不會因爲他獲得更大的折扣而改變。

你正在使用的這個例子與Decorator模式通常給出的例子非常接近,不過這通常是因爲它證明了可以將多個折扣應用到正在裝飾的對象(Passenger)。看看咖啡例如在維基here

另一種可能性是Strategy模式,這給你一個乾淨的界面,用於創建一個乘客的機票,而內部將其切換DiscountStrategy取決於什麼類型乘客請求票。

+0

+1乘客類的擔心與折扣邏輯正交 – 2013-03-13 09:41:15

+0

謝謝傑米,很好的回答。我想我會按照看起來最合適的戰略模式去做。商業客戶需要他們的商業名稱的臉部記錄怎麼樣?西部島嶼的客戶需要將他們的居住島記錄下來嗎?這是我感到困惑。再次感謝。 – 2013-03-13 10:02:43

+0

@DarrenFindlay - 啊哈,現在* *可能會給你一個繼承的例子。乘客顯然有額外的功能(在這種情況下,額外信息的新領域)。作爲一個副作用,您可以使用乘客類型來確定使用正確的折扣策略。 – Jamiec 2013-03-13 10:22:48

-1

如果它是所有關於折扣shemes,這可能足以只使用Decorator模式由他人描述。

然後你會檢查接口的類型,而不是乘客的,如果你想例如列出的商務旅客的數量,或居住出於營銷目的等

0

你想使貼息政策靈活,乘客是不是真的不同。

您可以從PassengerCompany派生出Customer基類,但這並不影響您應用折扣邏輯的方式。

繼承意味着不同的行爲,但乘客的行爲不會改變,只是應用的折扣,所以它不適合該類折扣不應該是乘客狀態的一部分。此外,許多折扣僅在某些時間段內纔有效,並且將其編碼到Customer類中沒有任何意義,您應該可以動態添加和刪除它們。

至於折扣的邏輯其實是在客戶應用業務規則,它應該被封裝到一個單獨的組類。用於執行此操作的常見模式是strategy。根據您的設計,因爲您希望將不同的策略應用於不同類型的用戶,您可能會發現visitor模式有用或無用。

0

我將使用前面文章中描述的策略模式「另一種可能性是策略模式,它爲您提供了一個乾淨的界面,用於爲乘客創建票證,而在內部它根據需要什麼類型的乘客來切換DiscountStrategy一張票。」