public
abstract
class
Specification<T>
{
public
abstract
bool
IsSatisfiedBy(T entity);
public
Specification<T> And(Specification<T> other)
{
return
new
AndSpecification<T>(
this
, other);
}
public
Specification<T> Or(Specification<T> other)
{
return
new
OrSpecification<T>(
this
, other);
}
public
Specification<T> Not()
{
return
new
NotSpecification<T>(
this
);
}
}
public
class
AndSpecification<T> : Specification<T>
{
private
Specification<T> _left;
private
Specification<T> _right;
public
AndSpecification(Specification<T> left, Specification<T> right)
{
_left = left;
_right = right;
}
public
override
bool
IsSatisfiedBy(T entity)
{
return
_left.IsSatisfiedBy(entity) && _right.IsSatisfiedBy(entity);
}
}
public
class
OrSpecification<T> : Specification<T>
{
private
Specification<T> _left;
private
Specification<T> _right;
public
OrSpecification(Specification<T> left, Specification<T> right)
{
_left = left;
_right = right;
}
public
override
bool
IsSatisfiedBy(T entity)
{
return
_left.IsSatisfiedBy(entity) || _right.IsSatisfiedBy(entity);
}
}
public
class
NotSpecification<T> : Specification<T>
{
private
Specification<T> _specification;
public
NotSpecification(Specification<T> specification)
{
_specification = specification;
}
public
override
bool
IsSatisfiedBy(T entity)
{
return
!_specification.IsSatisfiedBy(entity);
}
}