趣味编程:C#中Specification模式的实现(参考答案 - 上)
2010-09-30 21:02:07 来源:WEB开发网此外,使用扩展方法的好处在于,如果我们想要加一个逻辑运算(如“异或”),那么是不需要修改接口的。修改接口是一件劳民伤财的事情。
至此,我们使用Specification对象就容易多了,因为不需要为每段逻辑创建一个独立的 ISpecification<T>类型。但是,其实还有更简单的:直接使用委托。既然整个Specificaiton对象的逻辑可以使用一个委托直接表示,那为什么我们还需要一个“外壳”呢?不如直接使用这样的委托类型:
public delegate bool Spec<T>(T candicate);
当然,您也可以直接使用Func<T, bool>。我在这里创建Spec的目的,是因为我想“明确”这里其实是一个Specification,而不是一个普通的“接受T作为参数,返回 bool的方法”。于是现在,我们便可以用这样的扩展方法来编写And,Or和Not:
public static class SpecExtensions
{
public static Spec<T> And<T>(this Spec<T> one, Spec<T> other)
{
return candidate => one(candidate) && other(candidate);
}
public static Spec<T> Or<T>(this Spec<T> one, Spec<T> other)
{
return candidate => one(candidate) || other(candidate);
}
public static Spec<T> Not<T>(this Spec<T> one)
{
return candidate => !one(candidate);
}
}
Tags:趣味 编程 Specification
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接