我正在为我在大学的OOP课程规范建立一个航班预订系统。系统必须用C#编写。我想知道解决以下问题的最佳方法是
该公司目前实行折扣计划。西部群岛居民可享受10%的折扣。 Scotia还将这些乘客的居住岛记录下来用于营销目的。商业 旅行者可享受25%的折扣,必须提供公司名称。普通乘客没有 除非是当前促销活动的一部分,否则通常会获得折扣,在这种情况下,他们会收到折扣 5%的折扣。
我是否应该有乘客舱,每个独立类型的客户都是从哪个乘客舱继承的?任何有关这方面的帮助将不胜感激
答案 0 :(得分:7)
在我看来,你不想继承Passenger。继承意味着对象在某种程度上发生了变化,但无论乘客获得什么折扣,乘客都是乘客。换句话说,他的功能并没有因为他获得更大的折扣而改变。
您使用的这个示例非常接近通常为Decorator
模式提供的示例,尽管这通常是因为它表明可以对正在装饰的对象(在您的情况下为Passenger)应用多个折扣。看一下维基here
另一种可能性是Strategy
模式,这为您提供了一个干净的界面,用于为乘客创建票证,而在内部则根据请求票证的乘客类型切换DiscountStrategy
。
答案 1 :(得分:0)
你想让折扣政策变得灵活,乘客并没有那么不同。
您可以拥有一个Customer
基类,Passenger
和Company
派生,但这并不会影响您应用折扣逻辑的方式。
继承意味着不同的行为,但乘客的行为不会改变,只有应用的折扣和折扣不应该是乘客状态的一部分,因此它不适合该类。此外,许多折扣仅在某个时间段内有效,并且将其编码到Customer类中是没有意义的,您应该能够动态地添加和删除它们。
由于折扣逻辑实际上是应用于客户的业务规则,因此应将其封装到一组单独的类中。用于实现此目的的常见模式是strategy。根据您的设计,由于您希望将不同的策略应用于不同类型的用户,您可能会发现visitor模式有用与否。
答案 2 :(得分:0)
我会使用战略模式,如前面的帖子中所述“另一种可能性是策略模式,这为您提供了一个干净的界面,可以为乘客创建一个票证,而在内部则根据请求的乘客类型切换DiscountStrategy票“。
答案 3 :(得分:-1)
如果全部是关于折扣的话题,那么仅使用其他人描述的装饰者模式就足够了。
然后你会检查界面的类型,而不是乘客,如果你想列出出于营销目的的商务旅行者或住所的数量等。