我正在爲我的OOP課程的規範建立一個機票預定系統。系統必須用C#編寫。我想知道什麼是解決以下問題的最佳方法:有條件預訂系統的最佳設計模式
該公司目前運營折扣方案。 Western Isles居民可享受10%的折扣。 斯科舍還記錄這些乘客的居住島爲營銷目的。商務 旅客得到25%的折扣,並且必須提供他們的公司名稱。普通乘客不需要 通常會獲得折扣,除非它是當前促銷活動的一部分,在這種情況下,他們會收到5%的折扣 。
我應該有一個乘客艙,每個單獨類型的客戶從哪裏繼承?任何幫助,將不勝感激
我正在爲我的OOP課程的規範建立一個機票預定系統。系統必須用C#編寫。我想知道什麼是解決以下問題的最佳方法:有條件預訂系統的最佳設計模式
該公司目前運營折扣方案。 Western Isles居民可享受10%的折扣。 斯科舍還記錄這些乘客的居住島爲營銷目的。商務 旅客得到25%的折扣,並且必須提供他們的公司名稱。普通乘客不需要 通常會獲得折扣,除非它是當前促銷活動的一部分,在這種情況下,他們會收到5%的折扣 。
我應該有一個乘客艙,每個單獨類型的客戶從哪裏繼承?任何幫助,將不勝感激
在我看來,你不希望從乘客繼承。繼承意味着對象在某種程度上發生了變化,但無論他獲得多少折扣,乘客都是乘客。換句話說,他的功能不會因爲他獲得更大的折扣而改變。
你正在使用的這個例子與Decorator
模式通常給出的例子非常接近,不過這通常是因爲它證明了可以將多個折扣應用到正在裝飾的對象(Passenger)。看看咖啡例如在維基here
另一種可能性是Strategy
模式,這給你一個乾淨的界面,用於創建一個乘客的機票,而內部將其切換DiscountStrategy
取決於什麼類型乘客請求票。
+1乘客類的擔心與折扣邏輯正交 – 2013-03-13 09:41:15
謝謝傑米,很好的回答。我想我會按照看起來最合適的戰略模式去做。商業客戶需要他們的商業名稱的臉部記錄怎麼樣?西部島嶼的客戶需要將他們的居住島記錄下來嗎?這是我感到困惑。再次感謝。 – 2013-03-13 10:02:43
@DarrenFindlay - 啊哈,現在* *可能會給你一個繼承的例子。乘客顯然有額外的功能(在這種情況下,額外信息的新領域)。作爲一個副作用,您可以使用乘客類型來確定使用正確的折扣策略。 – Jamiec 2013-03-13 10:22:48
如果它是所有關於折扣shemes,這可能足以只使用Decorator模式由他人描述。
然後你會檢查接口的類型,而不是乘客的,如果你想例如列出的商務旅客的數量,或居住出於營銷目的等
我將使用前面文章中描述的策略模式「另一種可能性是策略模式,它爲您提供了一個乾淨的界面,用於爲乘客創建票證,而在內部它根據需要什麼類型的乘客來切換DiscountStrategy一張票。」
如果乘客可以獲得多種折扣,我可能也會使用裝飾者,是這樣嗎? – 2013-03-13 09:22:04
嗨,本傑明。每位客戶只能收到其中一種可用的折扣。謝謝。 – 2013-03-13 09:24:06
您的描述是否意味着乘客可以獲得多種折扣?由於居住*和業務的25%,因此10%?如果是這樣,我想每個折扣一個派生類是行不通的。在現實世界的場景中,我會考慮一些簡單的if語句,因爲引入完整的模式似乎被過度工程化。然而,如果它是功課並且想要炫耀,也許你可以找到更適合「許多折扣」要求的產品。 – nvoigt 2013-03-13 09:24:07