这是一种设计模式吗?

时间:2010-04-17 19:43:31

标签: c# .net design-patterns

我必须建立一些财务数据报告,并且为了进行计算,有很多“如果那时”的情况:如果它是一个大客户,减去10%,如果它的邮政编码等于'10101',则添加10 %,如果这个日子是在星期六,做一个困难的计算等。

所以我曾经读过这样的例子,他们所做的是(希望我记得很清楚)创建一个带有一些基本信息的类,并且可以为它添加各种计算对象。

所以把我记得的东西放在伪代码中

Basecalc bc = new baseCalc();
//put the info in the bc so other objects can do their if
bc.Add(new Largecustomercalc());
bc.Add(new PostalcodeCalc());
bc.add(new WeekdayCalc());

bc将运行所有添加的Calc对象的Calc()方法。 当我输入这个时,我认为所有Calc对象必须能够看到Basecalc属性才能正确执行它们的计算逻辑。

因此所有if都在不同的Calc对象中,而不是在Basecalc中的所有。

这有意义吗?

我想知道这是否是某种设计模式?

4 个答案:

答案 0 :(得分:5)

正如dtb建议的那样,责任链似乎在这里最适用,略有不同:通常,责任链找到正好一个处理程序,然后退出。如果周六有大客户订购,则需要执行两个处理程序。请注意,这样做是一个非平凡的扩展,因为您的对象可能在平均时间内发生了变化,并且处理程序的排序变得相关。这可能非常棘手。例如。如果有10美元的折扣和10%的折扣怎么办?现在,操作顺序有所不同,除非两者都按原价运行。你猜对了。

重要的是要意识到设计模式并不明确,因此通常没有一个正确的答案。我仍然相信这与责任链非常接近,并且与已经提到的其他模式相比更进一步。

首先,希望具体实施检查它们是否实际适用于手头的项目,这对于责任链来说是典型的。

其次,根据对象中的实际数据,您需要的行为会有所不同。 策略模式简单地封装了基本上实现相同功能的不同算法(即,您可以使用不同的策略来计算10%的折扣,但它们都应该产生相同的值)。

Command 模式是实际请求执行操作的解耦模式,例如如果你想让其他人计算折扣,你就会为它生成一个Command对象。实际上,(多播)事件的处理程序通常是责任链

Composite 模式是为树状结构而制作的,您可以像在现实世界中一样组合对象。这与之前提到的问题有关:如果您将责任链表示为退化子树(没有分支),您将拥有一个有序列表,您可以表示先减去$ 10,然后减去10%或另一种方式之间的差异周围。从这个意义上说,它可以被理解为一种高度退化的复合材料。 Composite可用于描述特定的折扣方案。仍然,选择和应用该计划将是责任链的工作。

就像我说的那样,这些并不是明确的术语,它们彼此密切相关,经常在变体(和滥用)中找到,最重要的是,每个模式都需要对您的具体问题进行一些更改。尽管如此,我还是倾向于使用一些变体来坚持责任链的术语,因为我认为它与你描述的情况最接近。

答案 1 :(得分:3)

对我来说似乎是Strategy pattern。可能与Composite pattern混合,因为您可以将Calculation实现添加到对象中。

答案 2 :(得分:1)

在那里似乎有两种模式,取决于你正在看什么。如果您通过标准的“计算”方法谈论工作委托到项目列表,那么这就是Command pattern的示例。如果您正在讨论计算器类的实现,那就是Decorator pattern

答案 3 :(得分:0)

它不是责任链,责任链有完全不同的目的。它是命令模式(没有撤消/重做)和复合(组合命令)的组合。正如其他人所指出的那样,你也可以认为它是战略的一部分,但同样也是为了成为战略的一个好榜样而堕落。有些人可能会称之为“内部DSL”。 正如大多数人所指出的那样:你无法真正定义它是什么,因为它取决于你的观点。如果你的计算有多种方法,并且遍历算法会调用所有这些方法 - 或者根据操作数调用子集,例如 - 这将是战略,唯一可以肯定的是“复合”。