有条件预订系统的最佳设计模式

时间:2013-03-13 09:18:02

标签: c# oop design-patterns

我正在为我在大学的OOP课程规范建立一个航班预订系统。系统必须用C#编写。我想知道解决以下问题的最佳方法是

  

该公司目前实行折扣计划。西部群岛居民可享受10%的折扣。   Scotia还将这些乘客的居住岛记录下来用于营销目的。商业   旅行者可享受25%的折扣,必须提供公司名称。普通乘客没有   除非是当前促销活动的一部分,否则通常会获得折扣,在这种情况下,他们会收到折扣   5%的折扣。

我是否应该有乘客舱,每个独立类型的客户都是从哪个乘客舱继承的?任何有关这方面的帮助将不胜感激

4 个答案:

答案 0 :(得分:7)

在我看来,你想继承Passenger。继承意味着对象在某种程度上发生了变化,但无论乘客获得什么折扣,乘客都是乘客。换句话说,他的功能并没有因为他获得更大的折扣而改变。

您使用的这个示例非常接近通常为Decorator模式提供的示例,尽管这通常是因为它表明可以对正在装饰的对象(在您的情况下为Passenger)应用多个折扣。看一下维基here

上的咖啡示例

另一种可能性是Strategy模式,这为您提供了一个干净的界面,用于为乘客创建票证,而在内部则根据请求票证的乘客类型切换DiscountStrategy

答案 1 :(得分:0)

你想让折扣政策变得灵活,乘客并没有那么不同。

您可以拥有一个Customer基类,PassengerCompany派生,但这并不会影响您应用折扣逻辑的方式。

继承意味着不同的行为,但乘客的行为不会改变,只有应用的折扣和折扣不应该是乘客状态的一部分,因此它不适合该类。此外,许多折扣仅在某个时间段内有效,并且将其编码到Customer类中是没有意义的,您应该能够动态地添加和删除它们。

由于折扣逻辑实际上是应用于客户的业务规则,因此应将其封装到一组单独的类中。用于实现此目的的常见模式是strategy。根据您的设计,由于您希望将不同的策略应用于不同类型的用户,您可能会发现visitor模式有用与否。

答案 2 :(得分:0)

我会使用战略模式,如前面的帖子中所述“另一种可能性是策略模式,这为您提供了一个干净的界面,可以为乘客创建一个票证,而在内部则根据请求的乘客类型切换DiscountStrategy票“。

答案 3 :(得分:-1)

如果全部是关于折扣的话题,那么仅使用其他人描述的装饰者模式就足够了。

然后你会检查界面的类型,而不是乘客,如果你想列出出于营销目的的商务旅行者或住所的数量等。