成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[437714]]

1 規格模式的定義

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

2 規格模式的應用場景

規格模式主要適用于以下應用場景。

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

(2)從集合中選擇符合特定業務規則的對象或對象子集。

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

3 規格模式的UML類圖

規格模式的UML類圖如下圖所示。

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

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

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

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

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

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

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

4 規格模式的通用寫法

以下是規格模式的通用寫法。

  1. public class Client { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //待分析的對象 
  5.         List<Object> list = new ArrayList<Object>(); 
  6.         //定義兩個業務規格書 
  7.         ISpecification spec1 = new BizSpecification("a"); 
  8.         ISpecification spec2 = new BizSpecification("b"); 
  9.         //規格調用 
  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.     //抽象規格書 
  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.     //組合規格書 
  30.     static abstract class CompositeSpecification implements ISpecification { 
  31.         //是否滿足條件由子類實現 
  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.     //與規格書 
  48.     static class AndSpecification extends CompositeSpecification { 
  49.         //傳遞兩個規格書進行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.         //傳遞兩個規格書進行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.         //傳遞兩個規格書進行非操作 
  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.     //業務規格書 
  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.             //根據基準對象判斷是否符合 
  105.             return true
  106.         } 
  107.     } 

5 規格模式的優點

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

6 規格模式的缺點

規格模式中有一個很嚴重的問題就是父類依賴子類,這種情景只有在非常明確不會發生變化的場景中存在,它不具備擴展性,是一種固化而不可變化的結構。一般在面向對象設計中應該盡量避免。

 

責任編輯:姜華 來源: Tom彈架構
相關推薦

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

單態單態設計設計模式

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技術棧公眾號

主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 国内av在线| 日韩一区二区福利视频 | 久久精品国产久精国产 | 少妇淫片aaaaa毛片叫床爽 | 三级欧美 | 亚洲综合99 | 小早川怜子xxxxaⅴ在线 | 午夜影院毛片 | 一区二区三区在线 | 国产综合精品一区二区三区 | 伦理午夜电影免费观看 | 亚洲高清成人 | 特级一级黄色片 | 国产在线资源 | 啪一啪在线视频 | 国产97久久| 日韩av中文 | 亚洲精品小视频在线观看 | 国产精品1区2区3区 一区中文字幕 | 国产精品我不卡 | 国产一区二区三区在线 | 欧美亚洲视频 | 久久精品日产第一区二区三区 | 国产精品伦一区二区三级视频 | 中文字幕亚洲一区二区三区 | 日韩一区二区三区在线视频 | 亚洲欧美在线一区 | 成人精品在线视频 | 99国产精品久久久久久久 | 久久精品网 | 欧洲性生活视频 | av在线天堂网 | 国产乱码精品一区二区三区五月婷 | 国产精品99久久久久久大便 | 久久久久久久久久久丰满 | 久久久www成人免费精品张筱雨 | 色吊丝2| 国产一二三区精品视频 | 欧洲免费视频 | 中文字幕国产精品 |