c# - 这是设计模式吗?

标签 c# .net design-patterns

我要建立一些财务数据报表,为了计算,有很多'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/

相关文章:

c# - 是将要从 main() 调用的所有方法声明为静态的还是创建一个包含包括 main 在内的所有方法的类的对象更好?

c# - MVC 3 C# - 部署和 MYSQL 数据库

c# - 何时使用非对称 key 与数字证书

c# - 反序列化包含无效数据类型的 xml

design-patterns - 具有函数式编程的链接对象?

c# - ?运营商VS??运营商使用

.net - 字符串中的日期时间格式?

c# - 异常如何在 C# 中工作(在幕后)

design-patterns - 我是否可以应用特定的模式来收集多个操作的数据?

java - 如何通过反射改变方法行为?