2013-06-02 27 views
2

我已阅读了规范模式的一些示例,但很难理解如何使用此模式实现。如何根据我的要求使用规范模式?

我正在为客户开发一个庞大的程序。我需要从特定的银行导入XML文件,然后对每个文件进行验证。分类帐代码有不同的方法(subs,bo,rcc)。所以当一个文件读取SUBS时,它应该发送给SUBS方法。

实施例这里:

接口:

  • BlackBank
  • BlueBank
  • 雷德班克

总帐代码:

  • SUBS
  • BO
  • RCC

结果:

  • BlackBank有SUBS,BO和RCC
  • BlueBank有SUBS
  • 雷德班克有BO和RCC

你可以举一些例子代码或指向正确的方向吗?

+0

你英语不错,你只需要学习如何更好地提出问题。有[维基百科](http://en.wikipedia.org/wiki/Specification_pattern)上的示例代码,如果你能解释你对此不了解的内容,也许会更好(不是100%肯定)? – Ben

+0

我的确读过维基百科,但它太多了,难以理解。我更喜欢符合我的要求的示例代码。如果你不介意给我示例代码:) – user1358072

+0

这是一个很好的代码示例(不是你的具体域名,但很说明):http://www.dimecasts.net/Content/WatchEpisode/139 –

回答

10

如果没有上下文,这很难回答,所以我会尝试围绕我的信息制作一些东西,希望它能给你一个想法。

创建像这样

interface ISpecification<T> 
{ 
    IsSatisfiedBy(T obj); 
} 

一个简单的规范接口,假装你有 '银行' 看起来像

interface IBank 
{ 
    LedgerCode LedgerCode { get; set; } 
} 

基本接口和LedgerCodes

[Flags] 
enum LedgerCodes 
{ 
    SUBS, BO, RCC 
} 

您的枚举可以做一个简单的分类账代码规范来检查一个IBank的LedgerCodes(这是相当普遍的,你需要让您的具体需要)

class LedgerCodeSpec : ISpecification<IBank> 
{ 
    private LedgerCode code; 

    public LedgerCodeSpecification(LedgerCode code) 
    { 
     this.code = code 
    } 

    public override bool IsSatisfiedBy(IBank obj) 
    { 
     return obj.LedgerCode == code; 
    } 
} 

在适当的地方,你可以用你的规范,在这里我用它来提供简单的验证。另一个用途是用于“选择”,例如从存储库

​​

最后一些代码来快速测试得到的数据/证明上述

class Main 
{ 
    public static void Main() 
    { 
     var spec = new LedgerCodeSpec(LedgerCodes.SUB) 
     var blueBank = new Bank(spec); 

     Console.WriteLine(blueBank.IsValid); // false 

     blueBank.LedgerCode = LedgerCodes.RCC | LedgerCodes.SUB; 

     Console.WriteLine(blueBank.IsValid); // false 

     blueBank.LedgerCode = LedgerCodes.SUB; 

     Console.WriteLine(blueBank.IsValid); // true 
    } 
} 

有在网络上的一些很好的例子将扩展方法,也覆盖运营商提供一个简洁,更自然的可读规格例如

class MessageSpecification : Specification<string> 
{ 
    public const int MIN_LENGTH = 5; 
    public const int MAX_LENGTH = 60; 

    public override bool IsSatisfiedBy(string s) 
    { 
     Specification<string> length = new LengthSpecification(MIN_LENGTH, MAX_LENGTH); 
     Specification<string> isNull = new IsNullSpecification<string>(); 

     Specification<string> spec = length && !isNull; 

     return spec.IsSatisfiedBy(s); 
    } 
} 

我目前使用的模式的方式可能是矫枉过正,但我​​喜欢去除,再利用,一般使逻辑更OO的思想。

编辑:阅读了一些评论后,你的问题似乎更多地涉及到一般的调度问题,而不是规范模式。给你的接口,你可以更简单地做。

class BankFacade 
{ 
    public Send(IBlueBank bank) 
    { 
     // validate with specification 
     // do stuff with IBlueBank 
    } 

    public Send(IRedBank bank) 
    { 
     // validate with specification 
     // do stuff with IRedBank 
    } 

    //... 
} 

想着一些可以,但是你可能并不真正需要的模式,你可以做沿着

class Parser 
{ 
    static class RedBankSpecification : ISpecification<XElement> 
    { 
     public override bool IsSatisfiedBy(XElement element) 
     { 
      return element.Value.equals("RED"); 
     } 
    } 

    public void Parse(XDocument doc) 
    { 
     var rspec = new RedBankSpecification(); 

     foreach(XElement e in doc) 
     { 
      if (r.IsSatisfiedBy(e)) 
      { 
       IRedBank bank = new RedBank(e); 
       bankFacade.Send(bank); 
      } 
     } 

     //... 
    } 
} 

线的东西,你shuoldn't试图鞋拔子问题到它

+1

感谢您的示例代码。这种给了我基本的想法。我会尝试一下。祝我好运。再次感谢.... – user1358072

+0

你为什么感谢人,而不是将答案标记为接受?您是否需要更多信息或答案没有帮助? –