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

設(shè)計(jì)模式之規(guī)格模式(Specification Pattern)

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

[[437714]]

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

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

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

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

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

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

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

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

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

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

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

(2)組合規(guī)格書(CompositeSpecification):一般設(shè)計(jì)為抽象類,對規(guī)格書進(jìn)行與或非操作,實(shí)現(xiàn)and()、or()、not()方法,在方法中關(guān)聯(lián)子類,因?yàn)樽宇悶楣潭悾愿割惪梢赃M(jìn)行關(guān)聯(lián)。

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

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

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

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

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

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

  1. public class Client { 
  2.  
  3.     public static void main(String[] args) { 
  4.         //待分析的對象 
  5.         List<Object> list = new ArrayList<Object>(); 
  6.         //定義兩個(gè)業(yè)務(wù)規(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.         //是否滿足條件由子類實(shí)現(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.         //傳遞兩個(gè)規(guī)格書進(jìn)行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.         //進(jìn)行and運(yùn)算 
  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.         //傳遞兩個(gè)規(guī)格書進(jìn)行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.         //進(jìn)行or運(yùn)算 
  76.         public boolean isSatisfiedBy(Object candidate) { 
  77.             return left.isSatisfiedBy(candidate) || right.isSatisfiedBy(candidate); 
  78.         } 
  79.     } 
  80.  
  81.     static class NotSpecification extends CompositeSpecification { 
  82.         //傳遞兩個(gè)規(guī)格書進(jìn)行非操作 
  83.         private ISpecification spec; 
  84.  
  85.         public NotSpecification(ISpecification spec) { 
  86.             this.spec = spec; 
  87.         } 
  88.  
  89.         //進(jìn)行not運(yùn)算 
  90.         public boolean isSatisfiedBy(Object candidate) { 
  91.             return !spec.isSatisfiedBy(candidate); 
  92.         } 
  93.     } 
  94.  
  95.     //業(yè)務(wù)規(guī)格書 
  96.     static class BizSpecification extends CompositeSpecification { 
  97.         //基準(zhǔn)對象,如姓名等,也可以是int等類型 
  98.         private String obj; 
  99.         public BizSpecification(String obj) { 
  100.             this.obj = obj; 
  101.         } 
  102.         //判斷是否滿足要求 
  103.         public boolean isSatisfiedBy(Object candidate){ 
  104.             //根據(jù)基準(zhǔn)對象判斷是否符合 
  105.             return true
  106.         } 
  107.     } 

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

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

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

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

 

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

2019-08-16 10:46:46

JavaScript工廠模式抽象工廠模式

2021-11-29 09:38:12

設(shè)計(jì)模式對象池模式Object Pool

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2024-07-31 10:41:16

C#設(shè)計(jì)模式

2012-08-22 10:10:25

單態(tài)單態(tài)設(shè)計(jì)設(shè)計(jì)模式

2021-06-09 08:53:34

設(shè)計(jì)模式策略模式工廠模式

2012-02-29 09:41:14

JavaScript

2015-09-08 13:39:10

JavaScript設(shè)計(jì)模式

2021-06-16 08:56:06

模版方法模式設(shè)計(jì)模式行為型設(shè)計(jì)模式

2012-01-13 15:59:07

2023-09-04 13:14:00

裝飾器設(shè)計(jì)模式

2021-06-29 08:54:23

設(shè)計(jì)模式代理模式遠(yuǎn)程代理

2021-12-24 07:50:45

責(zé)任鏈模式設(shè)計(jì)

2024-02-19 08:38:34

建造者模式Android設(shè)計(jì)模式

2010-03-25 08:52:30

PHP設(shè)計(jì)模式代理模式

2010-04-19 09:30:00

工廠模式PHP設(shè)計(jì)模式

2020-12-01 07:16:05

重學(xué)設(shè)計(jì)模式

2016-03-28 10:23:11

Android設(shè)計(jì)單例

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2021-03-05 07:57:41

設(shè)計(jì)模式橋接
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 81精品国产乱码久久久久久 | 欧美日韩久 | 精品欧美久久 | 成人黄色电影免费 | 影音先锋中文字幕在线观看 | 国产精品久久久久无码av | 99伊人 | 97人人干| 四色永久| 一区二区日韩 | 国产一区二区在线免费观看 | 亚洲精品一区二区冲田杏梨 | 国产高清一区二区三区 | 国产精品视频久久久 | 国产欧美日韩综合精品一区二区 | 一级国产精品一级国产精品片 | 伊人伊成久久人综合网站 | 成人av片在线观看 | 国产福利观看 | 毛片网站在线观看视频 | 成人一区二 | 国产精品久久久久久久岛一牛影视 | 能免费看的av | 国产成人精品免费 | 亚洲一区二区久久 | 欧美1级 | 日本久草 | 国产精品精品视频一区二区三区 | 狠狠艹 | 日批免费在线观看 | 福利一区视频 | 亚洲一区二区免费电影 | 国产精品不卡视频 | 日日操日日舔 | 精品伊人久久 | 久草视频在线播放 | 99久久久99久久国产片鸭王 | 亚洲网站在线观看 | 在线亚洲人成电影网站色www | 99精品国自产在线 | 精品国产精品国产偷麻豆 |