您的问题是您的规范接口使用的是泛型类型参数,这会阻止它用于跨不同专业化(客户、合同)组合评估逻辑,因为 ISpecification<Customer> 实际上是与 ISpecification<Contract> 不同的接口。您可以使用上面 Jeff 的方法,它摆脱了类型参数并将所有内容作为基本类型(对象)传递。根据您使用的语言,您还可以将事物提升到一个级别,并使用委托将规范与布尔逻辑结合起来。C# 示例(在编写时不是特别有用,但可能会给您一些关于框架的想法):
ISpecification<Customer> cust_spec = /*...*/
ISpecification<Contract> contract_spec = /*... */
bool result = EvalWithAnd( () => cust_spec.IsSatisfiedBy(customer), () => contract_spec.IsSatisfiedBy( contract ) );
public void EvalWithAnd( params Func<bool>[] specs )
{
foreach( var spec in specs )
{
if ( !spec() )
return false; /* If any return false, we can short-circuit */
}
return true; /* all delegates returned true */
}