【问题标题】:Which design pattern can be used for the Railway ticket fare calculation?铁路票价计算可以使用哪种设计模式?
【发布时间】:2015-11-04 11:20:30
【问题描述】:

我正在开发一种类似于铁路票务的解决方案。

背景:给出了来自泰米尔纳德邦的 18 个火车站。乘客需要一张票。对于最多 5 个车站的旅程,票价为 10 卢比。 5站后,每5站,将收取5卢比的额外费用。对于完整的旅程,即从第一站到最后一站,票价为卢比。 20.

例如

Input 1 : StationFrom - Guindy, StationTo - Kadambakkam
Output 1 : Print ticket. i.e. StationFrom : Guindy, StationTo : Kadambakkam, Total Stops : 3, Total Fare : 10

Input 2 : StationFrom - Guindy , StationTo - Chennai Fort
Output 2 : Print ticket. i.e. StationFrom : Guindy, StationTo : Chennai Fort, Total Stops : 8, Total Fare :15

未来可以添加更多的票价计算业务规则。

问题是,在票价计算中哪些设计模式是正确的选择?

【问题讨论】:

    标签: oop design-patterns decorator strategy-pattern builder-pattern


    【解决方案1】:

    策略 模式也适合您的要求。您可以为 5、10、20 站票价定义多个策略类。根据站点数量,您可以加载相应的策略。您可以使用工厂方法首先创建票价对象。 策略 + 工厂方法 + 构建器 组合适合您。

    1. BaseFareRule、AgeRule、StationsRule、DistanceRule、FestivalRule 是核心策略(接口)

    2. 这些策略中的每一个都有具体的实现。获取特定策略,如 FiveStationTenStation 策略使用 FactoryMethod 模式。甚至您可以拥有多个 FiveStation 策略,并且可以通过规则配置动态更改实现。策略最适合这种类型的需求。

    3. FareRuleBuilder 是一个构建器类,具有许多使用 Composition 模式配置的规则集。

    无论装饰器或策略如何,规则都是接口。两种解决方案都需要 Builder 和 FactoryMethod

    您可以在解决方案中使用 Decorator 或 Stretegy(一个问题可以有多个解决方案),但我更喜欢策略,它是票价计算的核心组件

    【讨论】:

    【解决方案2】:

    策略模式适用于这种情况。因此,您有一个策略,例如根据停靠次数决定票价应该是多少。如果以后您的策略发生变化,例如我们需要根据距离计算票价,您可以轻松更改策略。 p>

    如果您想在计算的票价之上添加服务税,请对其进行装饰。

    所以,我建议使用策略和装饰模式。

    【讨论】:

    • 当您希望附加功能包装在基本功能上时,应该使用装饰器。那么,你将如何在类中进行包装?如果您使用装饰器模式,您仍然需要编写代码来决定装饰器类。还有一件事,如果以后业务规则发生变化,您将如何整合?
    • 我相信,当客户想要在运行时选择策略时,会使用策略。例如,当用户在线购买产品时,用户可以在不同的支付策略中选择任何一种策略,例如网上银行、货到付款、银行 ATM 密码等。例如 2. 用户想要对数组进行排序。用户可以选择任何策略,即快速排序、合并排序等。即在运行时选择将产生相同结果的策略。运行时不同的策略导致相同的目标。不是吗?我无法将给定的问题陈述与策略模式进行相同的类比。
    • 未来,如果业务需求为,应用适用的业务规则为票价,并检查年龄,即对于年龄
    • 现在您可以添加“责任链”来处理基于年龄/距离/节日日期等的折扣来处理这种情况
    • 也可以为装饰器添加责任链。战略意图:en.wikipedia.org/wiki/Strategy_pattern。装饰者意图:en.wikipedia.org/wiki/Decorator_pattern。什么是有意义的 A) BaseFare、AgeDecorator、DistanceDecorator、StationsDecorator、FestivalDecorator + 责任链或 B) BaseFareStrategy 或 BaseAgeStrategy 或 BaseAgeFestivalStrategy 或 BaseAgeDistanceStationsStrategy 等或 C) BaseFareStrategy、AgeStrategy、StationsStrategy、DistanceStrategy、FestivalStrategy + 责任链。
    【解决方案3】:

    我推荐你Decorator Pattern

    您拥有默认的 Price 类及其 Price 接口,然后创建从 Price 接口继承的装饰器接口。所有组合都是装饰器接口的子类。

    【讨论】:

    • 使用策略,您必须为每个行程组合创建一个类。但是,使用装饰器时,您可以在需要新功能/折扣时创建类。这意味着很少的类和不同的组合是由组合完成的。
    • 如果您添加新票价,即使装饰者也需要新课程,而策略也需要新课程。一个问题可以有多种解决方案。
    • 未来,如果业务需求为,应用适用的业务规则为票价,并检查年龄,即对于年龄
    • 您可以按照您认为会更简单的方式进行操作。但是如果你开始混合业务规则,我仍然认为装饰器会更好一些。
    • @blashser 为什么你认为 Decorator 会比 Strategy 好一点?
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多