溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

設(shè)計(jì)模式-規(guī)約模式C#版

發(fā)布時(shí)間:2020-05-22 16:54:46 來(lái)源:網(wǎng)絡(luò) 閱讀:2290 作者:virusswb 欄目:編程語(yǔ)言

設(shè)計(jì)模式-規(guī)約模式C#版

規(guī)約模式的使用場(chǎng)景就是規(guī)則,業(yè)務(wù)規(guī)則的碎片化。

業(yè)務(wù)規(guī)則的組合是不固定的,需要做成很容易組合,也很容易拆散的方式,規(guī)約模式是一個(gè)選擇。

下面的例子是一個(gè)書店中,用戶租書的場(chǎng)景。

需要判斷用戶的最大租書數(shù)和用戶的狀態(tài),需要同時(shí)滿足這兩個(gè)要求,才可以繼續(xù)租書。最大租書數(shù)和狀態(tài)這兩個(gè)規(guī)則拆散開來(lái),在需要的時(shí)候再進(jìn)行組合。不需要組合的地方,就單獨(dú)使用這些規(guī)則。

針對(duì)一個(gè)實(shí)體有不同的規(guī)則,把這些規(guī)則碎片化,隨意組合和拆散,這樣就構(gòu)成了規(guī)約模式。

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace DomainModel.Model 
  7.     /// <summary> 
  8.     /// 規(guī)約模式 
  9.     /// </summary> 
  10.     /// <typeparam name="T"></typeparam> 
  11.     public interface ISpecification<T> 
  12.     { 
  13.         bool IsSatisfiedBy(T entity); 
  14.         /// <summary> 
  15.         /// 與規(guī)約 
  16.         /// </summary> 
  17.         /// <param name="specification"></param> 
  18.         /// <returns></returns> 
  19.         ISpecification<T> And(ISpecification<T> specification); 
  20.         /// <summary> 
  21.         /// 或規(guī)約 
  22.         /// </summary> 
  23.         /// <param name="specification"></param> 
  24.         /// <returns></returns> 
  25.         ISpecification<T> Or(ISpecification<T> specification); 
  26.         /// <summary> 
  27.         /// 非規(guī)約 
  28.         /// </summary> 
  29.         /// <returns></returns> 
  30.         ISpecification<T> Not(); 
  31.     } 
  32.  
  33.     public class Customer 
  34.     { 
  35.         private ISpecification<Customer> _hasReachedMax; 
  36.         private ISpecification<Customer> _active; 
  37.  
  38.         public Customer(ISpecification<Customer> hasReachedMax, ISpecification<Customer> active) 
  39.         { 
  40.             this._hasReachedMax = hasReachedMax; 
  41.             this._active = active; 
  42.         } 
  43.         public int TotalRentNumber { getset; } 
  44.         public bool Active 
  45.         { 
  46.             get { return true; } 
  47.         } 
  48.  
  49.         public bool CanRent() 
  50.         { 
  51.             var specification = this._hasReachedMax.Not().And(this._active.Not()); 
  52.             return specification.IsSatisfiedBy(this); 
  53.         } 
  54.     } 
  55.  
  56.     public class HasReachedMaxSpecification : CompositeSpecification<Customer> 
  57.     { 
  58.         public override bool IsSatisfiedBy(Customer entity) 
  59.         { 
  60.             return entity.TotalRentNumber >= 6; 
  61.         } 
  62.     } 
  63.     public class CustomerActiveSpecification : CompositeSpecification<Customer> 
  64.     { 
  65.         public override bool IsSatisfiedBy(Customer entity) 
  66.         { 
  67.             return entity.Active; 
  68.         } 
  69.     } 
  70.     /// <summary> 
  71.     /// 組合規(guī)約 
  72.     /// </summary> 
  73.     /// <typeparam name="T"></typeparam> 
  74.     public abstract class CompositeSpecification<T> : ISpecification<T> 
  75.     { 
  76.  
  77.         public abstract bool IsSatisfiedBy(T entity); 
  78.  
  79.         public ISpecification<T> And(ISpecification<T> specification) 
  80.         { 
  81.             return new AndSpecification<T>(this, specification); 
  82.         } 
  83.  
  84.         public ISpecification<T> Not() 
  85.         { 
  86.             return new NotSpecification<T>(this); 
  87.         } 
  88.  
  89.         public ISpecification<T> Or(ISpecification<T> specification) 
  90.         { 
  91.             throw new NotImplementedException(); 
  92.         } 
  93.  
  94.  
  95.     } 
  96.  
  97.     public class AndSpecification<T> : CompositeSpecification<T> 
  98.     { 
  99.         private ISpecification<T> _left; 
  100.         private ISpecification<T> _right; 
  101.         public AndSpecification(ISpecification<T> left, ISpecification<T> right) 
  102.         { 
  103.             this._left = left; 
  104.             this._right = right; 
  105.         } 
  106.         public override bool IsSatisfiedBy(T entity) 
  107.         { 
  108.             return this._left.IsSatisfiedBy(entity) && this._right.IsSatisfiedBy(entity); 
  109.         } 
  110.     } 
  111.  
  112.     public class OrSpecification<T> : CompositeSpecification<T> 
  113.     { 
  114.         private ISpecification<T> _left; 
  115.         private ISpecification<T> _right; 
  116.         public OrSpecification(ISpecification<T> left, ISpecification<T> right) 
  117.         { 
  118.             this._left = left; 
  119.             this._right = right; 
  120.         } 
  121.         public override bool IsSatisfiedBy(T entity) 
  122.         { 
  123.             return this._left.IsSatisfiedBy(entity) || this._right.IsSatisfiedBy(entity); 
  124.         } 
  125.     } 
  126.  
  127.     public class NotSpecification<T> : CompositeSpecification<T> 
  128.     { 
  129.         private ISpecification<T> _inner; 
  130.         public NotSpecification(ISpecification<T> inner) 
  131.         { 
  132.             this._inner = inner; 
  133.         } 
  134.         public override bool IsSatisfiedBy(T entity) 
  135.         { 
  136.             return !this._inner.IsSatisfiedBy(entity); 
  137.         } 
  138.     } 

 

 

 

參考文獻(xiàn)

1.走向.NET架構(gòu)設(shè)計(jì)—第五章—業(yè)務(wù)層模式,原則,實(shí)踐(前篇)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI