使用哪种图案 - 如何设计
我是将设计思维应用于日常问题的过程。在这个过程中,我需要一些帮助。假设像赫兹这样的汽车租赁公司需要应用程序,并且需要定期的数据,他们需要根据一定的标准为客户提供服务。
标准是
- 所有列出的节假日(不是周末) - 分期付款的价格获得10%折扣
- 劳动节单独获得15折优惠租赁价格
- 如果服用> 3天上市假期 - 20%
- 如果考虑劳动节>3天 - 25%
- 等 - 更会来
我能想到的装饰开始关闭,如
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结合,这是一个汽车的域属性。
我希望我在这里有道理。任何建议请问?
干杯
我想说租金,价格,优惠等不属于车辆:这些是独立的抽象(S)。特别是这样似乎是种你在上面的列表提供的不被链接到一个特定的车型,只有租赁等日历天/长度
所以,不要试图把这些东西加到作为装饰的车辆。相反,创建一个单独的类(层次结构)来处理它们。
请注意,根据您的描述,你有两个用例:
- 租赁代理需要能够枚举所有现有的报价给客户像“如果你开始你的租金下周一,你会得到10%的折扣,或者如果你在星期二开始,但延长租金到3天,你会得到20%的折扣“等
- 具体租金的(估计)价格需要计算考虑到所有应用程序可折扣。
因此,一方面,你应该店集合,它允许代理逐个一一列举了,有文本描述在每个有效报价的实例。 (注意,报价最有可能无状态的,你可以在每个单一共享实例。)
OTOH你需要的功能各项优惠,以决定是否适用于给定具体的租金。这可以在个别报价类中实现,然后通过例如多元化来调用。一个优惠选择器(一种特殊类型的工厂),它重复收集优惠并选择给定租金的优惠(很好,你可以立即重用这个优惠的集合以达到不同的目的!)。然后,适用的报价实际上用于收取租赁费用(即不一定直接在租赁对象本身上),根据适用情况修改/移除费用。作为一个方面说明,如果你用一个单独的派生类IVehicleBase
来表示每个车辆模型,那么在现实生活中你将会有很多派生类,而且当新模型来临时你需要定期添加新类。并融入到车队中。而且,无论何时出现新车型,都需要更换代码,这从长远来看是一个维护头痛。当然,如果这只是一个实验/玩具项目,维护可能不是问题。
如果您觉得重要,请考虑在您的代码上添加有关该语言的详细信息。这将带领正确的人在这里。 – polarblau 2011-01-23 09:50:40
看起来像C# - 这是你的实际实现语言,还是只是一个插图?在前一种情况下,我建议添加`c#`标签。 – 2011-01-23 10:00:39