[英]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.