概述
策略模式
- 策略模式简介
在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税、外商投资企业或外商企业所得税和个人所得税,针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,而企业所得税有其对应计算方式。如果不采用策略模式来实现这样一个需求的话,可能我们会定义一个所得税类,该类有一个属性来标识所得税的类型,并且有一个计算税收的IncomeTax()方法,在该方法体内需要对税收类型进行判断,通过if-else语句来针对不同的税收类型来计算其所得税。这样的实现确实可以解决这个场景吗,但是这样的设计不利于扩展,如果系统后期需要增加一种所得税时,此时不得不回去修改CalculateTax方法来多添加一个判断语句,这样明白违背了“开放——封闭”原则。此时,我们可以考虑使用策略模式来解决这个问题,既然税收方法是这个场景中的变化部分,此时自然可以想到对税收方法进行抽象。具体的实现代码见2.3部分。
前面介绍了策略模式用来解决的问题,下面具体给出策略的定义。策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 - 策略模式的实现
namespace DesignPattern
{
/// <summary>
/// 策略模式
/// </summary>
public class StrategyMode
{
public static void Main(string[] args)
{
//个人所得税
FunctionRealization fr = new FunctionRealization(new PersonTaxStrategy());
Console.WriteLine(fr.GetITax(5000.00));
//企业所得税
FunctionRealization fre = new FunctionRealization(new EnterpriseTaxStrategy());
Console.WriteLine(fre.GetITax(5000000.00));
Console.ReadKey();
}
}
/// <summary>
/// 所得税策略【公共接口】
/// </summary>
public interface ITaxStrategy
{
double IncomeTax(double income);
}
/// <summary>
/// 个人所得税
/// </summary>
public class PersonTaxStrategy : ITaxStrategy
{
public double IncomeTax(double income)
{
return income * 0.11;
}
}
/// <summary>
/// 企业所得税
/// </summary>
public class EnterpriseTaxStrategy : ITaxStrategy
{
public double IncomeTax(double income)
{
return income * 0.15;
}
}
/// <summary>
/// 实现策略模式的功能
/// </summary>
public class FunctionRealization
{
private ITaxStrategy _ITaxStrategy;
public FunctionRealization(ITaxStrategy strategy)
{
this._ITaxStrategy = strategy;
}
public double GetITax(double income)
{
return _ITaxStrategy.IncomeTax(income);
}
}
- 策略模式的适用场景
在下面的两种情况下可以考虑使用策略模式:
1.一个系统需要动态地在几种算法中选择一种的情况下。那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口。
2.如果一个对象有很多的行为,如果不使用合适的模式,这些行为就只好使用多重的if-else语句来实现,此时,可以使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象涉及的概念。
- 策略模式的优缺点
策略模式的主要优点有:
1.策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
2.易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。
3.避免使用多重条件选择语句,充分体现面向对象设计思想。
策略模式的主要缺点有:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这点可以考虑使用IOC容器和依赖注入的方式来解决,关于IOC容器和依赖注入(Dependency Inject)的文章可以参考:IoC 容器和Dependency Injection 模式。
策略模式会造成很多的策略类。
最后
以上就是小巧月饼为你收集整理的策略模式的全部内容,希望文章能够帮你解决策略模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复