设计模式-策略模式C#版
设计模式-策略模式C#版
策略模式是一种常见和常用的设计模式,策略的独立和抽象。
常见的场景就是电子商务中的打折策略。可以随着用户类型的不同,打折的策略也不同。
或者是游戏中打怪场景,怪的掉血策略,随着自己的级别,装备不同,怪的掉血不同。
今天的列子是打折策略,根据用户类型不同,打折策略不同。
需要在金额上做不同的打折策略,所以就在金额上留下一个口子,一个接口,传入不同的策略实现,每种实现都针对金额打不同的折扣。
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceDomainModel.Model{///<summary>///打折策略///</summary>publicinterfaceIDiscountStrategy{decimalApply(decimaloriginalPrice);}publicclassPrice{privateIDiscountStrategy_discountStrategy;privatedecimal_salePrice;publicPrice(decimalsalePrice,IDiscountStrategydiscountStrategy){this._salePrice=salePrice;this._discountStrategy=discountStrategy;}///<summary>///应用策略///</summary>///<paramname="discountStrategy"></param>publicvoidSetDiscountStrategy(IDiscountStrategydiscountStrategy){this._discountStrategy=discountStrategy;}///<summary>///返回打折后的价格///</summary>publicdecimalSalePrice{get{returnthis._discountStrategy.Apply(this._salePrice);}}}publicclassProduct{publicintId{get;set;}publicstringName{get;set;}publicPricePrice{get;set;}}publicenumCustomerType{///<summary>/// 不打折///</summary>General=0,///<summary>/// 6折///</summary>Trade=1}publicclassNullDiscountStrategy:IDiscountStrategy{publicdecimalApply(decimaloriginalPrice){returnoriginalPrice;}}publicclassTradeDiscountStrategy:IDiscountStrategy{publicdecimalApply(decimaloriginalPrice){returnoriginalPrice*0.6m;}}///<summary>///折扣策略工厂///</summary>publicsealedclassDiscountStrategyFactory{publicstaticIDiscountStrategyGetDiscountStrategy(CustomerTypecustomerType){switch(customerType){caseCustomerType.General:returnnewNullDiscountStrategy();default:returnnewTradeDiscountStrategy();}}}publicinterfaceIProductRepository{IList<Product>Find();}publicstaticclassProductListExtensions{publicstaticvoidApplyDiscount(thisIList<Product>products,IDiscountStrategydiscountStrategy){foreach(varpinproducts){p.Price.SetDiscountStrategy(discountStrategy);}}}publicclassProductRepository:IProductRepository{publicIList<Product>Find(){returnnewList<Product>();}}publicclassProductService{privateIProductRepository_productRepository;publicProductService(){this._productRepository=newProductRepository();}publicProductService(IProductRepositoryproductRepository){this._productRepository=productRepository;}publicIList<Product>Find(CustomerTypecustomerType){vardiscountStrategy=DiscountStrategyFactory.GetDiscountStrategy(customerType);varproducts=this._productRepository.Find();products.ApplyDiscount(discountStrategy);returnproducts;}}publicclassClient{privateCustomerType_customerType=CustomerType.Trade;publicvoidFindProducts(){varservice=newProductService();varproducts=service.Find(this._customerType);}}}
参考文献
1.走向.NET架构设计—第三章—分层设计,初涉架构(中篇)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。