规格模式

作者: 上海马超23 | 来源:发表于2017-07-01 13:17 被阅读123次

带与或非的规格书接口

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));

相关文章

  • 规格模式

    带与或非的规格书接口 父类不是不能依赖子类,在明确不会发生变化的场景里可以存在,因为依赖子类不是面向接口编程,不具...

  • 规格模式

    不知道大家是否了解LINQ技术,LINQ(LanguageINtegrated Query,语言集成查询),它提供...

  • 规格模式

    根据条件查询对象,每一种查找条件定义一个类。 现在有许多 User 对象,根据 name 和 age 之类的条件查...

  • 规格模式(Specification Pattern)

    本文节选自《设计模式就该这样学》 1规格模式的定义 规格模式(Specification Pattern)可以认为...

  • 商品详情页流量提升(二)

    优化情景二-选择规格面板整体优化 优化背景 业务层面决定取消多规格多件起售模式,原本兼顾起售条件的模式是否有优化的...

  • 商城里面的SUK设计,今天你一定能学会它

    一.商城的产品价格介绍 1.商品价格可以分为单个价格模式2.商品价格分为多规格组合模今天要说的是多规格模式,单个价...

  • view绘制步骤

    测量(Measure) 测量规格(MeasureSpec):包含两部分,1.模式,2.大小。 1.模式...

  • 夹花水晶板

    规格:80 规格:50/60/1米 规格:60/1米 红玫瑰:70 规格:1米, 规格:70,1米, 规格:80/

  • 奈特科尔P10GT - 品牌介绍

    品牌:奈特科尔/NITECORE 型号:P10GT 电源模式:可充电 电池规格:18650 最大射程:286m 档...

  • 商品规格(注:商品规格可添加多个或不添加)

    如大杯、小份、半份等。添加规格前,需到规格库添加商品规格,具体操作:规格库→点击“添加规格”→输入规格名称、用料倍...

网友评论

    本文标题:规格模式

    本文链接:https://www.haomeiwen.com/subject/degwcxtx.html