規(guī)格模式

帶與或非的規(guī)格書接口

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

父類不是不能依賴子類,在明確不會(huì)發(fā)生變化的場(chǎng)景里可以存在,因?yàn)橐蕾囎宇惒皇敲嫦蚪涌诰幊?,不具備擴(kuò)展性。

組合規(guī)格書類

abstract class CompositeSpecification implements ISpecification {
  // 具體的命中邏輯交給子類實(shí)現(xiàn)
  abstract boolean isSatisfiedBy(Request);

  ISpecification and(ISpecification spec) {
    // 這里依賴了子類,但是and這個(gè)邏輯如果是不會(huì)變化的,這樣固化也沒有問題
    return new AndSpecification(this, spec);
  }
  
  ISpecification not() {
    return new NotSpecification(this);
  }

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

與規(guī)格書類

class AndSpecification extends CompositeSpecification {
  // 這里是重點(diǎn):這個(gè)類通過依賴多個(gè)相同接口類型的其他類,作為一個(gè)合并的操作,減少了參數(shù)的個(gè)數(shù)
  private ISpecification left;
  private ISpecification right;
  
  public AndSpecification(left, right) {
    this.left = left;
    this.right = right;
  }  
  
  // 或規(guī)格書,非規(guī)格書類似,重載實(shí)現(xiàn)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;
   }
}

場(chǎng)景類

ISpecification spec1 = new UserByAgeThan(25);
ISpecification spec2 = new UserByName("abc");
 // 2個(gè)spec經(jīng)過and方法,返回了一個(gè)spec,滿足了findUser方法參數(shù)的個(gè)數(shù)
provider.findUser(spec.and(spec2));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,124評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,886評(píng)論 18 139
  • 生活就是經(jīng)常的讓人猝不及防. 有些事早來(lái)比晚來(lái)好,心里想著,晚點(diǎn)來(lái)我就可以接受甚至緩解,其實(shí)錯(cuò)了,不想接受的永遠(yuǎn)在...
    馬毅不鬧了閱讀 114評(píng)論 0 0
  • 本文較長(zhǎng),如沒耐心,可拉倒底部看總結(jié),但你會(huì)錯(cuò)過很多精彩。 有一天,有個(gè)讀者留言問『為什么看了你很多文章,也學(xué)習(xí)了...
    迎刃閱讀 22,444評(píng)論 160 1,251