设计模式建议:规则检查器

时间:2011-04-04 05:17:50

标签: asp.net design-patterns

我向我的网站销售产品。最近我们收到了一份需要针对每个订单进行检查的规则列表,以确保它不是欺诈性的。因此,这个规则/欺诈指标列表将会发生变化和增长,因此我希望确保它易于维护且非常可靠。

我想我有一个抽象的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

3 个答案:

答案 0 :(得分:1)

规格模式

我一直在处理一个非常类似的问题。

我发现Specification Pattern特别有用。

对我而言,模式的主要好处在于它采用链接的方式。

上面的链接提供了基本概述,文章中的相关链接也很有用。之后,如果你再做一些搜索,你会发现更详细的例子。

答案 1 :(得分:0)

您已经使用过策略模式......我相信工厂模式可以解决您的问题。

Link

答案 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类。您还可以在其中创建仅处理部分规则的新方法,等等。