偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

設計模式之規(guī)格模式(Specification Pattern)

開發(fā) 前端
規(guī)格模式(Specification Pattern)可以認為是組合模式的一種擴展。很多時候程序中的某些條件決定了業(yè)務邏輯,這些條件就可以抽離出來以某種關系(與、或、非)進行組合,從而靈活地對業(yè)務邏輯進行定制。

[[437714]]

1 規(guī)格模式的定義

規(guī)格模式(Specification Pattern)可以認為是組合模式的一種擴展。很多時候程序中的某些條件決定了業(yè)務邏輯,這些條件就可以抽離出來以某種關系(與、或、非)進行組合,從而靈活地對業(yè)務邏輯進行定制。另外,在查詢、過濾等應用場合中,通過預定義多個條件,然后使用這些條件的組合來處理查詢或過濾,而不是使用邏輯判斷語句來處理,可以簡化整個實現(xiàn)邏輯。這里的每個條件都是一個規(guī)格,多個規(guī)格(條件)通過串聯(lián)的方式以某種邏輯關系形成一個組合式的規(guī)格。規(guī)格模式屬于結(jié)構(gòu)型設計模式。

2 規(guī)格模式的應用場景

規(guī)格模式主要適用于以下應用場景。

(1)驗證對象,檢驗對象本身是否滿足某些業(yè)務要求或者是否已經(jīng)為實現(xiàn)某個業(yè)務目標做好了準備。

(2)從集合中選擇符合特定業(yè)務規(guī)則的對象或?qū)ο笞蛹?/p>

(3)指定在創(chuàng)建新對象的時候必須要滿足某種業(yè)務要求。

3 規(guī)格模式的UML類圖

規(guī)格模式的UML類圖如下圖所示。

由上圖可以看到,規(guī)格模式主要包含6個角色。

(1)抽象規(guī)格書(Specification):對規(guī)格書的抽象定義。

(2)組合規(guī)格書(CompositeSpecification):一般設計為抽象類,對規(guī)格書進行與或非操作,實現(xiàn)and()、or()、not()方法,在方法中關聯(lián)子類,因為子類為固定類,所以父類可以進行關聯(lián)。

(3)與規(guī)格書(AndSpecification):對規(guī)格書進行與操作,實現(xiàn)isSatisfiedBy()方法。

(4)或規(guī)格書(OrSpecification):對規(guī)格書進行或操作,實現(xiàn)isSatisfiedBy()方法。

(5)非規(guī)格書(NotSpecification):對規(guī)格書進行非操作,實現(xiàn)isSatisfiedBy()方法。

(6)業(yè)務規(guī)格書(BizSpecification):實現(xiàn)isSatisfiedBy()方法,對業(yè)務進行判斷,一個類為一種判斷方式,可進行擴展。

4 規(guī)格模式的通用寫法

以下是規(guī)格模式的通用寫法。

  1. public class Client { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //待分析的對象 
  5.         List<Object> list = new ArrayList<Object>(); 
  6.         //定義兩個業(yè)務規(guī)格書 
  7.         ISpecification spec1 = new BizSpecification("a"); 
  8.         ISpecification spec2 = new BizSpecification("b"); 
  9.         //規(guī)格調(diào)用 
  10.         for (Object o : list) { 
  11.             if(spec1.and(spec2).isSatisfiedBy(o)){  //如果o滿足spec1 && spec2 
  12.                 System.out.println(o); 
  13.             } 
  14.         } 
  15.     } 
  16.  
  17.     //抽象規(guī)格書 
  18.     interface ISpecification { 
  19.         //候選者是否滿足條件 
  20.         boolean isSatisfiedBy (Object candidate) ; 
  21.         //and操作 
  22.         ISpecification and (ISpecification spec); 
  23.         //or操作 
  24.         ISpecification or (ISpecification spec); 
  25.         //not操作 
  26.         ISpecification not (); 
  27.     } 
  28.  
  29.     //組合規(guī)格書 
  30.     static abstract class CompositeSpecification implements ISpecification { 
  31.         //是否滿足條件由子類實現(xiàn) 
  32.         public abstract boolean isSatisfiedBy (Object candidate) ; 
  33.         //and操作 
  34.         public ISpecification and (ISpecification spec) { 
  35.             return new AndSpecification(this, spec); 
  36.         } 
  37.         //or操作 
  38.         public ISpecification or(ISpecification spec) { 
  39.             return new OrSpecification(this, spec); 
  40.         } 
  41.         //not操作 
  42.         public ISpecification not() { 
  43.             return new NotSpecification(this); 
  44.         } 
  45.     } 
  46.  
  47.     //與規(guī)格書 
  48.     static class AndSpecification extends CompositeSpecification { 
  49.         //傳遞兩個規(guī)格書進行and操作 
  50.         private ISpecification left
  51.         private ISpecification right
  52.  
  53.         public AndSpecification(ISpecification left, ISpecification right) { 
  54.             this.left = left
  55.             this.right = right
  56.         } 
  57.  
  58.         //進行and運算 
  59.         public boolean isSatisfiedBy(Object candidate) { 
  60.             return left.isSatisfiedBy(candidate) && right.isSatisfiedBy(candidate); 
  61.         } 
  62.     } 
  63.  
  64.  
  65.     static class OrSpecification extends CompositeSpecification { 
  66.         //傳遞兩個規(guī)格書進行or操作 
  67.         private ISpecification left
  68.         private ISpecification right
  69.  
  70.         public OrSpecification(ISpecification left, ISpecification right) { 
  71.             this.leftleft
  72.             this.right = right
  73.         } 
  74.  
  75.         //進行or運算 
  76.         public boolean isSatisfiedBy(Object candidate) { 
  77.             return left.isSatisfiedBy(candidate) || right.isSatisfiedBy(candidate); 
  78.         } 
  79.     } 
  80.  
  81.     static class NotSpecification extends CompositeSpecification { 
  82.         //傳遞兩個規(guī)格書進行非操作 
  83.         private ISpecification spec; 
  84.  
  85.         public NotSpecification(ISpecification spec) { 
  86.             this.spec = spec; 
  87.         } 
  88.  
  89.         //進行not運算 
  90.         public boolean isSatisfiedBy(Object candidate) { 
  91.             return !spec.isSatisfiedBy(candidate); 
  92.         } 
  93.     } 
  94.  
  95.     //業(yè)務規(guī)格書 
  96.     static class BizSpecification extends CompositeSpecification { 
  97.         //基準對象,如姓名等,也可以是int等類型 
  98.         private String obj; 
  99.         public BizSpecification(String obj) { 
  100.             this.obj = obj; 
  101.         } 
  102.         //判斷是否滿足要求 
  103.         public boolean isSatisfiedBy(Object candidate){ 
  104.             //根據(jù)基準對象判斷是否符合 
  105.             return true
  106.         } 
  107.     } 

5 規(guī)格模式的優(yōu)點

規(guī)格模式非常巧妙地實現(xiàn)了對象篩選功能,適合在多個對象中篩選查找,或者業(yè)務規(guī)則不適于放在任何已有實體或值對象中,而且規(guī)則變化和組合會掩蓋對象的基本含義的情況。

6 規(guī)格模式的缺點

規(guī)格模式中有一個很嚴重的問題就是父類依賴子類,這種情景只有在非常明確不會發(fā)生變化的場景中存在,它不具備擴展性,是一種固化而不可變化的結(jié)構(gòu)。一般在面向?qū)ο笤O計中應該盡量避免。

 

責任編輯:姜華 來源: Tom彈架構(gòu)
相關推薦

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2021-11-29 09:38:12

設計模式對象池模式Object Pool

2020-08-21 07:23:50

工廠模式設計

2024-07-31 10:41:16

C#設計模式

2012-08-22 10:10:25

單態(tài)單態(tài)設計設計模式

2015-09-08 13:39:10

JavaScript設計模式

2021-06-16 08:56:06

模版方法模式設計模式行為型設計模式

2012-01-13 15:59:07

2021-06-29 08:54:23

設計模式代理模式遠程代理

2023-09-04 13:14:00

裝飾器設計模式

2021-12-24 07:50:45

責任鏈模式設計

2012-02-29 09:41:14

JavaScript

2021-06-09 08:53:34

設計模式策略模式工廠模式

2024-02-19 08:38:34

建造者模式Android設計模式

2021-06-22 15:27:13

設計模式迭代器模式Java

2021-09-16 06:44:05

組合模式設計

2022-03-25 11:01:28

Golang裝飾模式Go 語言

2010-04-13 08:54:28

PHP設計模式命令模式

2023-12-13 13:28:16

裝飾器模式Python設計模式

2010-03-25 08:52:30

PHP設計模式代理模式
點贊
收藏

51CTO技術(shù)棧公眾號