我要建立一些财务数据报表,为了计算,有很多'if then'的情况:如果是大客户,减去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 中。
这有意义吗?
我想知道这是不是某种设计模式?
最佳答案
正如 dtb 所建议的,责任链 似乎最适用于此,但有细微的变化:通常,责任链找到恰好一个处理程序,然后退出。如果一个大客户在星期六下单,您需要执行两个处理程序。请注意,这样做是一个重要的扩展,因为您的对象可能同时发生了变化,并且处理程序的顺序变得相关。这可能非常棘手。例如。如果有 10 美元的折扣和 10% 的折扣怎么办?现在操作顺序会有所不同,除非两者都按原价工作。我猜你明白了。
重要的是要认识到设计模式并不明确,因此通常没有唯一的正确答案。我仍然相信这与责任链非常接近,并且与已经提到的其他模式相去甚远。
首先,最好让具体的实现执行检查它们是否实际适用于手头的项目,这对于责任链来说是典型的。
其次,根据对象中的实际数据,您需要的行为会有所不同。 Strategy 模式简单地封装了不同的算法,这些算法本质上实现了相同的目的(即,您可以使用不同的策略来计算 10% 的折扣,但它们都应该产生相同的值)。
命令 模式是实际请求 执行操作的解耦模式,例如如果您想让其他人计算折扣,您会为此生成一个 Command 对象。事实上,(多播)事件的处理程序通常是责任链。
Composite 模式专为树状结构而设计,您可以在其中像在现实世界中一样组合对象。这与之前提到的问题有关:如果您将责任链表示为退化子树(没有分支),您将拥有一个有序列表,您可以表示先减去 $10,然后减去 10% 或其他方式之间的差异大约。从这个意义上说,它可以理解为高度退化的复合体。 Composite 可用于描述特定的贴现方案。尽管如此,选择和应用该方案将是职责链的工作。
就像我说的,这些不是明确的术语,它们彼此密切相关,经常发现变化(和滥用),最重要的是,每种模式都需要针对您的特定问题进行一些更改。尽管如此,我还是更愿意坚持责任链的术语,但有一些变化,因为我相信它最接近您描述的情况。
关于c# - 这是设计模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659747/