规格模式

带与或非的规格书接口

interface ISpecification {
  // 是否满足条件
  boolean isSatisfiedBy(Request request)
  public ISpecification and(ISpecification spec);
  public ISpecification or(ISpecification spec);
  public ISpecification not();
}

父类不是不能依赖子类,在明确不会发生变化的场景里可以存在,因为依赖子类不是面向接口编程,不具备扩展性。

组合规格书类

abstract class CompositeSpecification implements ISpecification {
  // 具体的命中逻辑交给子类实现
  abstract boolean isSatisfiedBy(Request);

  ISpecification and(ISpecification spec) {
    // 这里依赖了子类,但是and这个逻辑如果是不会变化的,这样固化也没有问题
    return new AndSpecification(this, spec);
  }
  
  ISpecification not() {
    return new NotSpecification(this);
  }

  ISpecification or(ISpecification spec) {
    return new OrSpecification(this, spec);
  }
}

与规格书类

class AndSpecification extends CompositeSpecification {
  // 这里是重点:这个类通过依赖多个相同接口类型的其他类,作为一个合并的操作,减少了参数的个数
  private ISpecification left;
  private ISpecification right;
  
  public AndSpecification(left, right) {
    this.left = left;
    this.right = right;
  }  
  
  // 或规格书,非规格书类似,重载实现isSatisfiedBy
  @Override
  public boolean isSatisfiedBy(request) {
    return left.isSatisfiedBy(request) && right.isSatisfiedBy(request);
  }
}

用户操作接口

public interface IProvider {
  public List<Result> findUser(ISpecification spec);
}

用户操作

public class Provider implements IProvider {
  public Result findUser(ISpecification spec) {
    for(Request r : requests) {
      if (spec.isSatisfiedBy(r)) {
        result.add(...)
      }
    }
    return result;
   }
}

场景类

ISpecification spec1 = new UserByAgeThan(25);
ISpecification spec2 = new UserByName("abc");
 // 2个spec经过and方法,返回了一个spec,满足了findUser方法参数的个数
provider.findUser(spec.and(spec2));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,041评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,312评论 19 139
  • 生活就是经常的让人猝不及防. 有些事早来比晚来好,心里想着,晚点来我就可以接受甚至缓解,其实错了,不想接受的永远在...
    马毅不闹了阅读 871评论 0 0
  • 本文较长,如没耐心,可拉倒底部看总结,但你会错过很多精彩。 有一天,有个读者留言问『为什么看了你很多文章,也学习了...
    迎刃阅读 22,481评论 160 1,251