【问题标题】:Which patterns to use - how to design使用哪些模式 - 如何设计
【发布时间】:2011-01-23 09:40:43
【问题描述】:

全部,

我是将设计思维应用于日常问题的过程。在这个过程中,我需要一些帮助。假设像赫兹这样的汽车租赁公司需要一个应用程序以及常规数据,他们需要能够根据特定标准为客户提供优惠。

标准是

  1. 所有列出的假期(非周末) - 租金可享受 10% 的折扣
  2. 仅劳动节就可享受 15% 的租金折扣
  3. 如果列出的假期超过 3 天 - 可享受 20% 的折扣
  4. 如果在劳动节服用 >3 天 - 优惠 25%
  5. 等等——还会有更多

现在我可以想到装饰器,例如

IVehicleBase
{  
 Props: Make, Model, HirePrice, HireTimePeriodinDays   
}

具体类:

public class FordExplorer : VehicleBase   
{
    public override string Make
    {
        get { return "Ford"; }
    }

    public override string Model
    {
        get { return "Explorer"; }
    }

    public override double HirePrice
    {
        get { return 450; }
    }

    public override int HireTimePeriodinDays
    {
        get { return 1; }
    }
}

许多其他类别(汽车)也是如此。

现在我该如何装饰特价商品?

我可以想到一个vehicleDecoratorBase,但是如果报价仅针对假期,那很好(为劳动/其他列出的假期做两个具体的实现),但是我们将假期与hireDate结合在一起,这是汽车的域属性。

我希望我在这里说得通。有什么建议吗?

干杯

【问题讨论】:

  • 如果您认为这很重要,请考虑将语言的详细信息添加到您的标签中。这将把合适的人带到这里。
  • 看起来像 C# - 这是你的实际实现语言,还是只是一个插图?对于前一种情况,我建议添加c# 标签。
  • 我会推荐这本关于 DDD 的书,它确实为这种场景提供了说明:domaindrivendesign.org/books/evans_2003domaindrivendesign.org/books/nilsson_2006
  • 对不起,我会添加语言标签,是的,它是 C#。 @Pablo - 我的“精致”思维和困惑是在读完这本书之后,我试图验证并确保我的思维模式是正确的。不过感谢您的链接。

标签: c# design-patterns


【解决方案1】:

我会说租金、价格、特别优惠等不属于车辆:这些是单独的抽象。尤其是您上面列出的各种优惠似乎与特定车型无关,仅与日历天数/租赁期限等相关。

所以不要尝试将这些作为装饰器添加到车辆中。相反,创建一个单独的类(层次结构)来处理它们。

请注意,根据您的描述,您有两个用例:

  • 租赁代理需要能够向客户列举所有现有的报价,例如 “如果您在下周一开始租赁,您将获得 10% 的折扣,或者如果您从周二开始,但将租赁延长至 3 天,您将获得 20% 的折扣” 等等。
  • 需要计算混凝土租金的(估计)价格,并考虑所有适用的折扣。

因此,一方面,您应该将每个有效报价的实例存储在集合中,这样代理就可以将它们一一列出,并附上文字说明。 (请注意,由于优惠很可能是无状态的,您可以拥有每个优惠的单个共享实例。)

OTOH,您需要每个报价的功能来决定它是否适用于给定的具体租赁。这可以在单独的报价类中实现,然后通过例如多态调用。一个报价选择器(一种特殊的工厂),它遍历报价集合并选择给定租金的报价(很好,您可以立即将报价集合用于不同目的!)。然后,适用的优惠实际上是在收取租赁费用(即不一定直接在租赁对象本身上),并根据需要修改/删除费用。

附带说明,如果您使用单独的派生类IVehicleBase 表示每个车辆模型,那么您在现实生活中将拥有大量派生类,而且您需要定期添加新的类作为新模型出来并融入舰队。从长远来看,每当出现新车型时都需要更改代码是一项令人头疼的维护工作。当然,如果这只是一个实验/玩具项目,维护可能不是问题。

【讨论】:

  • 谢谢。有几个问题。新手还在这个领域。随时纠正我。价格最终是定义“车辆”的属性或属性。它可以表示为一个数字,并且根据 Craig Larman 的说法,它必须是一个属性。更重要的是,它是“汽车”域的一部分。这不是真的吗?我从这里blackwasp.co.uk/Decorator.aspx 选择了这个例子。那么装饰器的情况是什么?
  • @user554833,好吧,也许我让你的情况过于复杂了 :-) 我碰巧在一家汽车租赁公司工作,在现实生活中,这个领域比玩具示例复杂得多: -) 但是,如果您的观点只是尝试使用装饰器,那么将价格与车辆相关联是完全可以的。
  • 感谢您坚持回答。不要过于复杂,它的真实生活体验,我很感激。这是一个玩具示例,但我想确保在现实生活中使用所获得的知识。再次感谢
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多