设计模式-规约模式C#版
设计模式-规约模式C#版
规约模式的使用场景就是规则,业务规则的碎片化。
业务规则的组合是不固定的,需要做成很容易组合,也很容易拆散的方式,规约模式是一个选择。
下面的例子是一个书店中,用户租书的场景。
需要判断用户的最大租书数和用户的状态,需要同时满足这两个要求,才可以继续租书。最大租书数和状态这两个规则拆散开来,在需要的时候再进行组合。不需要组合的地方,就单独使用这些规则。
针对一个实体有不同的规则,把这些规则碎片化,随意组合和拆散,这样就构成了规约模式。
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceDomainModel.Model{///<summary>///规约模式///</summary>///<typeparamname="T"></typeparam>publicinterfaceISpecification<T>{boolIsSatisfiedBy(Tentity);///<summary>///与规约///</summary>///<paramname="specification"></param>///<returns></returns>ISpecification<T>And(ISpecification<T>specification);///<summary>///或规约///</summary>///<paramname="specification"></param>///<returns></returns>ISpecification<T>Or(ISpecification<T>specification);///<summary>///非规约///</summary>///<returns></returns>ISpecification<T>Not();}publicclassCustomer{privateISpecification<Customer>_hasReachedMax;privateISpecification<Customer>_active;publicCustomer(ISpecification<Customer>hasReachedMax,ISpecification<Customer>active){this._hasReachedMax=hasReachedMax;this._active=active;}publicintTotalRentNumber{get;set;}publicboolActive{get{returntrue;}}publicboolCanRent(){varspecification=this._hasReachedMax.Not().And(this._active.Not());returnspecification.IsSatisfiedBy(this);}}publicclassHasReachedMaxSpecification:CompositeSpecification<Customer>{publicoverrideboolIsSatisfiedBy(Customerentity){returnentity.TotalRentNumber>=6;}}publicclassCustomerActiveSpecification:CompositeSpecification<Customer>{publicoverrideboolIsSatisfiedBy(Customerentity){returnentity.Active;}}///<summary>///组合规约///</summary>///<typeparamname="T"></typeparam>publicabstractclassCompositeSpecification<T>:ISpecification<T>{publicabstractboolIsSatisfiedBy(Tentity);publicISpecification<T>And(ISpecification<T>specification){returnnewAndSpecification<T>(this,specification);}publicISpecification<T>Not(){returnnewNotSpecification<T>(this);}publicISpecification<T>Or(ISpecification<T>specification){thrownewNotImplementedException();}}publicclassAndSpecification<T>:CompositeSpecification<T>{privateISpecification<T>_left;privateISpecification<T>_right;publicAndSpecification(ISpecification<T>left,ISpecification<T>right){this._left=left;this._right=right;}publicoverrideboolIsSatisfiedBy(Tentity){returnthis._left.IsSatisfiedBy(entity)&&this._right.IsSatisfiedBy(entity);}}publicclassOrSpecification<T>:CompositeSpecification<T>{privateISpecification<T>_left;privateISpecification<T>_right;publicOrSpecification(ISpecification<T>left,ISpecification<T>right){this._left=left;this._right=right;}publicoverrideboolIsSatisfiedBy(Tentity){returnthis._left.IsSatisfiedBy(entity)||this._right.IsSatisfiedBy(entity);}}publicclassNotSpecification<T>:CompositeSpecification<T>{privateISpecification<T>_inner;publicNotSpecification(ISpecification<T>inner){this._inner=inner;}publicoverrideboolIsSatisfiedBy(Tentity){return!this._inner.IsSatisfiedBy(entity);}}}
参考文献
1.走向.NET架构设计—第五章—业务层模式,原则,实践(前篇)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。