簡體   English   中英

設計模式建議:規則檢查器

[英]Design Pattern Advice: Rule checker

我通過我的網站銷售產品。 最近,我們收到了需要針對每個訂單進行檢查的規則列表,以確保它沒有欺詐性。 因此,此規則/欺詐指標列表將不斷變化和增長,因此我想確保它易於維護且非常可靠。

我在想我有一個抽象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;
   }

}

然后,我考慮使用一個在其構造Order object中接受Order object並檢查規則列表的類。 就像是:

class FraudChecker
{
    List<Rule> rules;

    public FraudChecker(OrderItem currentOrder)
    {
        foreach(var rule in rules)
        {
            rule.CheckOrder(currentOrder);
        }
    }
}

因此,我試圖考慮填充FraudChecker .Rules列表的最佳位置/最佳方法,並開始考慮可能存在一些類似我正在做的事情的不錯的設計模式。

有沒有人看到我應該在這里使用的設計模式? 還是有人可以想到填充此列表的好地方?

-Evan

規格模式

我一直在處理一個非常類似的問題。

我發現規范模式特別有用。

對我來說,該模式的主要好處是它合並鏈接的方式。

上面的鏈接提供了基本概述,並且本文中的相關鏈接也很有用。 之后,如果您進行更多搜索,則會發現更多詳細示例。

您已經使用了Startegy模式...我相信工廠模式可以解決您的問題。

鏈接

我可能會使用自己的枚舉實現。 我將創建一個這樣的類:

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類。 您還可以在其中創建僅處理部分規則等的新方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM