设计模式-策略模式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架构设计—第三章—分层设计,初涉架构(中篇)