7

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

该公司目前实施折扣计划。西部群岛居民可享受 10% 的折扣。斯科舍还出于营销目的记录这些乘客的居住岛。商务旅客可享受 25% 的折扣,并且必须提供公司名称。普通乘客通常不会获得折扣,除非它是当前促销活动的一部分,在这种情况下,他们会获得 5% 的折扣。

我应该有一个乘客类,每种不同类型的客户都继承自该类吗?对此的任何帮助将不胜感激

4

4 回答 4

7

在我看来,您不想从Passenger继承。继承意味着对象以某种方式发生变化,但乘客无论获得什么折扣都是乘客。换句话说,他的功能不会因为他获得更大的折扣而改变。

您使用的这个示例与通常为该Decorator模式给出的示例非常接近,尽管这通常是因为它表明可以将多个折扣应用于被装饰的对象(在您的情况下为乘客)。在这里查看 wiki 上的 Coffee 示例

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

于 2013-03-13T09:40:14.980 回答
0

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

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

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

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

于 2013-03-13T09:38:41.553 回答
0

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

于 2013-03-15T04:51:56.677 回答
-1

如果都是关于折扣方案,那么只使用其他人描述的装饰器模式就足够了。

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

于 2013-03-13T09:31:20.023 回答