这是一种设计模式吗?

Mic*_*hel 4 .net c# 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());
Run Code Online (Sandbox Code Playgroud)

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

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

这有意义吗?

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

mne*_*syn 5

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

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

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

其次,根据对象中的实际数据,您需要的行为会有所不同.该战略模式简单地封装了不同的算法,基本上实现同样的事情(也就是你可以有不同的策略来计算10%的折扣,但他们都应该得到相同的值).

命令模式是针对去耦模式实际要求进行操作,例如,如果你想拥有别人计算折扣,你会产生一个Command对象为.实际上,(多播)事件的处理程序通常是责任链.

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

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