如果没有上下文,这很难回答,所以我会尝试围绕我的信息制作一些东西,希望它能给你一个想法。
创建像这样
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试图鞋拔子问题到它
你英语不错,你只需要学习如何更好地提出问题。有[维基百科](http://en.wikipedia.org/wiki/Specification_pattern)上的示例代码,如果你能解释你对此不了解的内容,也许会更好(不是100%肯定)? – Ben
我的确读过维基百科,但它太多了,难以理解。我更喜欢符合我的要求的示例代码。如果你不介意给我示例代码:) – user1358072
这是一个很好的代码示例(不是你的具体域名,但很说明):http://www.dimecasts.net/Content/WatchEpisode/139 –