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

C#中用Specification模式實現可定制的業務邏輯

開發 后端
事情源于如何實現OrWhere的功能,這里將要講述的是怎樣用C#中的Specification模式實現可定制的業務邏輯,希望對大家有所幫助。

這里將要講述的是怎樣用C#中的Specification模式實現可定制的業務邏輯,也就是避免傳統where語句的局限性,在一定程度上是有其價值的。

今天有朋友在問了我這么一個問題:怎么實現OrWhere的功能?我猜測,他的意思是要實現這樣的功能:

  1. static IEnumerable<int> MorePredicate(IEnumerable<int> source)  
  2. {  
  3.     return source.OrWhere(i => i > 0); // 或所有的正數  
  4. }  
  5.  
  6. static void Main(string[] args)  
  7. {  
  8.     var array = Enumerable.Range(-5, 10).ToArray();  
  9.     var odd = array.Where(i => i % 2 != 0);  // 排除所有偶數  
  10.     var oddOrPositive = MorePredicate(odd);  
  11.  
  12.     foreach (var i in oddOrPositive)  
  13.     {  
  14.         Console.WriteLine(i);  
  15.     }  

以上代碼應該輸出-5,-3,-1,1,2,3,4。但顯然,這段代碼是無法編譯通過,無法通過補充類庫來實現的。因為在Main方法中的Where過后,已經排除了所有的偶數,于是在接下來的代碼中是無法從新的序列中再次恢復元素的。

不過這個要求讓我想起了Specification模式。Specification模式的作用是構建可以自由組裝的業務邏輯元素。Specification類有一個IsSatisifiedBy函數,用于校驗某個對象是否滿足該Specification所表示的條件。多個Specification對象可以組裝起來,并生成新Specification對象,這便可以形成高度可定制的業務邏輯。例如,我們可以使用依賴注入(控制反轉)的方式來配置這個業務邏輯,以此保證系統的靈活性。

如果您點開上面那個Wikipedia的鏈接,就會發現這段描述大約是一個英譯中的練習。抄完了“定義”,再來看看同樣引自Wikipedia的UML圖:

Wikipedia的UML圖

 

一般來說,Specification模式則意味著實現這樣一個接口:

  1. public interface ISpecification  
  2. {  
  3.     bool IsSatisfiedBy(T candidate);  
  4.  
  5.     ISpecification And(ISpecification other);  
  6.  
  7.     ISpecification Or(ISpecification other);  
  8.  
  9.     ISpecification Not();  

實現了ISpecification的對象則意味著是一個Specification,它可以通過與其他Specification對象的And,Or或對自身的取反來生成新的邏輯。為了方便這些“組合邏輯”的開發,我們還會準備一個抽象的CompositeSpecification類:

  1. public abstract class CompositeSpecification : ISpecification  
  2. {  
  3.     public abstract bool IsSatisfiedBy(T candidate);  
  4.  
  5.     public ISpecification And(ISpecification other)  
  6.     {  
  7.         return new AndSpecification(this, other);  
  8.     }  
  9.  
  10.     public ISpecification Or(ISpecification other)  
  11.     {  
  12.         return new OrSpecification(this, other);  
  13.     }  
  14.  
  15.     public ISpecification Not()  
  16.     {  
  17.         return new NotSpecification(this);  
  18.     }  

CompositeSpecification提供了構建復合Specification的基礎邏輯,它提供了And、Or和Not方法的實現,讓其他Specification類只需要專注于IsSatisfiedBy方法的實現即可。例如,以下便是三種邏輯組合的具體實現:

  1. public class AndSpecification : CompositeSpecification  
  2. {  
  3.     private ISpecification m_one;  
  4.     private ISpecification m_other;  
  5.  
  6.     public AndSpecification(ISpecification x, ISpecification y)  
  7.     {  
  8.         m_one = x;  
  9.         m_other = y;  
  10.     }  
  11.  
  12.     public override bool IsSatisfiedBy(T candidate)  
  13.     {  
  14.         return m_one.IsSatisfiedBy(candidate) && m_other.IsSatisfiedBy(candidate);  
  15.     }  
  16. }  
  17.  
  18. public class OrSpecification : CompositeSpecification  
  19. {  
  20.     private ISpecification m_one;  
  21.     private ISpecification m_other;  
  22.  
  23.     public OrSpecification(ISpecification x, ISpecification y)  
  24.     {  
  25.         m_one = x;  
  26.         m_other = y;  
  27.     }  
  28.  
  29.     public override bool IsSatisfiedBy(T candidate)  
  30.     {  
  31.         return m_one.IsSatisfiedBy(candidate) || m_other.IsSatisfiedBy(candidate);  
  32.     }  
  33. }  
  34.  
  35. public class NotSpecification : CompositeSpecification  
  36. {  
  37.     private ISpecification m_wrapped;  
  38.  
  39.     public NotSpecification(ISpecification x)  
  40.     {  
  41.         m_wrapped = x;  
  42.     }  
  43.  
  44.     public override bool IsSatisfiedBy(T candidate)  
  45.     {  
  46.         return !m_wrapped.IsSatisfiedBy(candidate);  
  47.     }  

于是,我們便可以使用Specification模式來處理剛才那位朋友的問題。例如,首先他需要排除所有的偶數,那么我們不妨實現一個OddSpecification:

  1. public class OddSpecification : CompositeSpecification  
  2. {  
  3.     public override bool IsSatisfiedBy(int candidate)  
  4.     {  
  5.         return candidate % 2 != 0;  
  6.     }  

自然,還有用于獲得所有正數的Specification類:

  1. public class PositiveSpecification : CompositeSpecification  
  2. {  
  3.     public override bool IsSatisfiedBy(int candidate)  
  4.     {  
  5.         return candidate > 0;  
  6.     }  

于是在使用時,我們會將其通過Or方法組合起來:

  1. static ISpecification MorePredicate(ISpecification original)  
  2. {  
  3.     return original.Or(new PositiveSpecification());  
  4. }  
  5.  
  6. static void Main(string[] args)  
  7. {  
  8.     var array = Enumerable.Range(-5, 10).ToArray();  
  9.     var oddSpec = new OddSpecification();  
  10.     var oddAndPositiveSpec = MorePredicate(oddSpec);  
  11.  
  12.     foreach (var item in array.Where(i => oddAndPositiveSpec.IsSatisfiedBy(i)))  
  13.     {  
  14.         Console.WriteLine(item);  
  15.     }  

但是,您覺得這個做法怎么樣?我覺得過于殺雞用牛刀,高射炮打蚊子了。Specification模式雖然常用,但是用在這里太重量級了。如果我們為每一個函數都補充一個Specification類,至少會讓我感到厭倦。

以上的代碼其實轉載自Wikipedia詞條,不過我修改了一些命名,以及改寫成泛型版本。我們有理由推測,Wikipedia上是非常舊的內容,很可能是在C#只是1.0版本的時候編寫的代碼(或者說它為了“兼容”Java那種語言的實現方式)。那么在實際開發過程中,我們又該如何利用C#如今的強大特性來實現出更容易使用,甚至是更為“輕量級”的Specification模式呢?

此外,剛才又收到那位朋友的消息,他其實是想在使用LINQ to SQL時實現“可擴展的邏輯”。那么,對于他說的情況,我們又該如何應對呢?

原文標題:趣味編程:C#中Specification模式的實現

鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/15/specification-pattern-in-csharp-practice.html

【編輯推薦】

  1. C#數組操作的體會淺談
  2. 全面介紹C#指針操作
  3. C#數組初始化的應用實例解析
  4. C#指針使用簡析
  5. 淺談C#數組工作方式
責任編輯:彭凡 來源: 博客園
相關推薦

2009-06-02 10:10:15

C#

2009-08-04 09:22:26

C#工廠模式

2009-08-25 11:13:28

C#獲取邏輯硬盤信息

2009-08-25 18:04:30

C#實現Singlet

2009-08-11 15:46:15

C#日歷控件

2011-03-29 09:14:49

Dispose模式C#

2024-07-22 14:34:20

簡單工廠模式C#

2021-12-01 07:38:27

設計模式規格模式Specificati

2010-01-12 14:51:18

VB.NET業務層

2013-11-27 16:57:26

微淘C2B

2009-08-26 10:24:04

C# Observer

2009-08-31 16:12:02

C#使用Singlet

2009-08-25 17:52:01

C#可空值類型

2022-03-13 09:12:00

瀏覽器webCSS 樣

2009-07-10 14:55:34

2024-11-06 11:38:59

C#單例模式

2009-09-01 18:29:10

C#繼承C#多態

2009-08-26 09:54:45

C#打印預覽C#打印

2009-08-03 16:35:30

C#日期比較

2009-08-12 14:23:09

C#邏輯運算符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲综合99| 日韩在线不卡 | 亚欧性视频 | 夜操| 中文字幕一区二区三区四区五区 | 天天干夜夜操视频 | 视频一区二区中文字幕日韩 | 国产黄色大片在线免费观看 | 欧美一区二区黄 | 天堂网中文字幕在线观看 | 日皮视频免费 | 夜夜草 | 天天干亚洲 | 久久久久国产精品午夜一区 | 国产一级电影在线 | 精品国产一区二区三区在线观看 | 黄网站色大毛片 | 黄网址在线观看 | 成人在线免费观看视频 | 日韩国产欧美一区 | 在线中文一区 | 国产精品99久久久久久久久 | 国内成人免费视频 | 麻豆久久久久久久 | 久久乐国产精品 | 国产视频1区 | 久久久精品一区二区三区 | 免费在线视频一区二区 | 皇色视频在线 | 国产精品久久久久久久久 | 欧美在线| 毛片a区 | 精品成人| 欧美亚洲激情 | 天天影视色综合 | 免费人成激情视频在线观看冫 | 午夜视频网站 | v亚洲| h视频在线免费观看 | 国产欧美精品 | 久久久精品影院 |