设计模式-规约模式C#版

设计模式-规约模式C#版

10年积累的网站建设、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站后付款的网站建设流程,更有井陉免费网站建设让你可以放心的选择与我们合作。

规约模式的使用场景就是规则,业务规则的碎片化。

业务规则的组合是不固定的,需要做成很容易组合,也很容易拆散的方式,规约模式是一个选择。

下面的例子是一个书店中,用户租书的场景。

需要判断用户的最大租书数和用户的状态,需要同时满足这两个要求,才可以继续租书。最大租书数和状态这两个规则拆散开来,在需要的时候再进行组合。不需要组合的地方,就单独使用这些规则。

针对一个实体有不同的规则,把这些规则碎片化,随意组合和拆散,这样就构成了规约模式。

 

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

 

 

 

参考文献

1.走向.NET架构设计—第五章—业务层模式,原则,实践(前篇)


标题名称:设计模式-规约模式C#版
本文来源:http://xwwzsj.com/article/igsgdh.html

其他资讯

售后响应及时

7×24小时客服热线

数据备份

更安全、更高效、更稳定

价格公道精准

项目经理精准报价不弄虚作假

合作无风险

重合同讲信誉,无效全额退款