我向我的网站销售产品。最近我们收到了一份需要针对每个订单进行检查的规则列表,以确保它不是欺诈性的。因此,这个规则/欺诈指标列表将会发生变化和增长,因此我希望确保它易于维护且非常可靠。
我想我有一个抽象的class rule
,每个规则都实现了。
abstract class Rule
{
public string Message;
public bool Success;
public void CheckOrder(OrderItem currentOrder);
}
class FakeCreditCardNumberRule : Rule
{
public string Message = "Fake CC Number Rule";
public void CheckOrder(OrderItem currentOrder)
{
currentOrder.CreditCardNumber = "1234-5678-9012-3456";
Success = false;
}
}
class ReallyLargeOrderRule : Rule
{
public string Message = "Really Large Order Rule";
public void CheckOrder(OrderItem currentOrder)
{
currentOrder.ItemsOrder.Count > 100;
Success = false;
}
}
然后我想要一个在它的costructor中接受Order object
的类,并检查规则列表。类似的东西:
class FraudChecker
{
List<Rule> rules;
public FraudChecker(OrderItem currentOrder)
{
foreach(var rule in rules)
{
rule.CheckOrder(currentOrder);
}
}
}
因此,我试图想出填充FraudChecker的最佳位置/最佳方式 .Rules列表并开始思考可能会有一些很好的设计模式,就像我正在做的那样。
有没有人见过我应该在这里使用的设计模式?或者,有人可以想到一个填充此列表的好地方吗?
-Evan
答案 0 :(得分:1)
我一直在处理一个非常类似的问题。
我发现Specification Pattern特别有用。
对我而言,模式的主要好处在于它采用链接的方式。
上面的链接提供了基本概述,文章中的相关链接也很有用。之后,如果你再做一些搜索,你会发现更详细的例子。
答案 1 :(得分:0)
您已经使用过策略模式......我相信工厂模式可以解决您的问题。
答案 2 :(得分:0)
我可能会使用自己的枚举实现。我会创建一个这样的类:
public sealed class Rules
{
public static readonly Rule FakeCreditCardNumberRule = new FakeCreditCardNumberRule ();
public static readonly Rule ReallyLargeOrderRule = new ReallyLargeOrderRule ();
//here I would write more
private static readonly List<Rule> _all = List<Rule> { FakeCreditCardNumberRule, ReallyLargeOrderRule };
//every time you add new rule to the class you have to add it to the _all list also
public static IEnumerable<Rule> All
{
get
{
return _all;
}
}
public static FraudChecker(OrderItem currentOrder)
{
foreach(var rule in All)
{
rule.CheckOrder(currentOrder);
}
}
}
然后你可以像这样使用它:
Rules.FraudChecker(currentOrder);
或
Rules.FakeCreditCardNumberRule.CheckOrder(currentOrder);
您可以将每个新规则添加到Rules类。您还可以在其中创建仅处理部分规则的新方法,等等。