标签:
原文:C#设计模式(20)——计谋者模式(Stragety Pattern)一、引言
前面主题介绍的状态模式是对某个东西状态的抽象,而本文要介绍的计谋模式也就是对计谋进行抽象,计谋的意思就是要领,所以也就是对要领的抽象,下面具体分享下我对计谋模式的理解。
二、计谋者模式介绍 2.1 计谋模式的界说在现实生活中,计谋模式的例子也非每每见,例如,中国的所得税,分为企业所得税、外商投资企业或外商企业所得税和小我私家所得税,针对付这3种所得税,针对每种,所计算的方法差别,小我私家所得税有小我私家所得税的计算方法,,而企业所得税有其对应计算方法。如果不给与计谋模式来实现这样一个需求的话,可能我们会界说一个所得税类,该类有一个属性来标识所得税的类型,并且有一个计算税收的CalculateTax()要领,在该要领体内需要对税收类型进行判断,通过if-else语句来针对差此外税收类型来计算其所得税。这样的实现确实可以解决这个场景吗,但是这样的设计倒霉于扩展,如果系统后期需要增加一种所得税时,此时不得不回去改削CalculateTax要领来多添加一个判断语句,这样大白违背了“开放——关闭”原则。此时,我们可以考虑使用计谋模式来解决这个问题,既然税收要领是这个场景中的变革部分,此时自然可以想到对税收要领进行抽象。具体的实现代码见2.3部分。
前面介绍了计谋模式用来解决的问题,下面具体给出计谋的界说。计谋模式是针对一组算法,将每个算法封装到具有大众接口的独立的类中,从而使它们可以彼此替换。计谋模式使得算法可以在不影响到客户真个情况下产生变革。
2.2 计谋模式的布局计谋模式是对算法的包装,是把使用算法的责任和算法自己支解开,委派给差此外东西卖力。计谋模式凡是把一系列的算法包装到一系列的计谋类里面。用一句话慨括计谋模式就是——“将每个算法封装到差此外计谋类中,使得它们可以互换”。
下面是计谋模式的布局图:
该模式涉及到三个角色:
环境角色(Context):持有一个Strategy类的引用
抽象计谋角色(Strategy):这是一个抽象角色,凡是由一个接口或抽象类来实现。此角色给出所有具体计谋类所需实现的接口。
具体计谋角色(ConcreteStrategy):包装了相关算法或行为。
2.3 计谋模式的实现下面就以所得税的例子来实现下计谋模式,具体实现代码如下所示:
1 namespace StrategyPattern 2 { 3 // 所得税计算计谋 4 public interface ITaxStragety 5 { 6 double CalculateTax(double income); 7 } 8 9 // 小我私家所得税 10 public class PersonalTaxStrategy : ITaxStragety 11 { 12 public double CalculateTax(double income) 13 { 14 return income * 0.12; 15 } 16 } 17 18 // 企业所得税 19 public class EnterpriseTaxStrategy : ITaxStragety 20 { 21 public double CalculateTax(double income) 22 { 23 return (income - 3500) > 0 ? (income - 3500) * 0.045 : 0.0; 24 } 25 } 26 27 public class InterestOperation 28 { 29 private ITaxStragety m_strategy; 30 public InterestOperation(ITaxStragety strategy) 31 { 32 this.m_strategy = strategy; 33 } 34 35 public double GetTax(double income) 36 { 37 return m_strategy.CalculateTax(income); 38 } 39 } 40 41 class App 42 { 43 static void Main(string[] args) 44 { 45 // 小我私家所得税方法 46 InterestOperation operation = new InterestOperation(new PersonalTaxStrategy()); 47 Console.WriteLine("小我私家付出的税为:{0}", operation.GetTax(5000.00)); 48 49 // 企业所得税 50 operation = new InterestOperation(new EnterpriseTaxStrategy()); 51 Console.WriteLine("企业付出的税为:{0}", operation.GetTax(50000.00)); 52 53 Console.Read(); 54 } 55 } 56 }
三、计谋者模式在.NET中应用