package org.myddd.domain.specification;

/**
 * 业务规范接口，对应于DDD一书中的“规范”概念，用于判断业务规则是否得到满足。
 * @param <T> 类型参数，表示规范所应用到的目标对象类型
 */
public interface Specification<T> {

  /**
   * 检查 {@code t} 是否由本规范满足.
   *
   * @param t 要测试的对象.
   * @return 如果{@code t}满足此规范则返回{@code true}。
   */
  boolean isSatisfiedBy(T t);

  /**
   * 创建一个新规范，作为本规范{@code this}和另一个规范{@code specification}的“与（AND）”操作的结果
   * @param specification 另一个规范。
   * @return 一个新规范。
   */
  Specification<T> and(Specification<T> specification);

  /**
   * 创建一个新规范，作为本规范{@code this}和另一个规范{@code specification}的“或（OR）”操作的结果
   * @param specification 另一个规范。
   * @return 一个新规范。
   */
  Specification<T> or(Specification<T> specification);

  /**
   * 创建一个新规范，作为本规范的“非（NOT）”操作的结果
   * @return 一个新规范。
   */
  Specification<T> not();
}
