策略模式

策略模式

  1. 策略模式简介
    在现实生活中,策略模式的例子也非常常见,例如,中国的所得税,分为企业所得税、外商投资企业或外商企业所得税和个人所得税,针对于这3种所得税,针对每种,所计算的方式不同,个人所得税有个人所得税的计算方式,而企业所得税有其对应计算方式。如果不采用策略模式来实现这样一个需求的话,可能我们会定义一个所得税类,该类有一个属性来标识所得税的类型,并且有一个计算税收的IncomeTax()方法,在该方法体内需要对税收类型进行判断,通过if-else语句来针对不同的税收类型来计算其所得税。这样的实现确实可以解决这个场景吗,但是这样的设计不利于扩展,如果系统后期需要增加一种所得税时,此时不得不回去修改CalculateTax方法来多添加一个判断语句,这样明白违背了“开放——封闭”原则。此时,我们可以考虑使用策略模式来解决这个问题,既然税收方法是这个场景中的变化部分,此时自然可以想到对税收方法进行抽象。具体的实现代码见2.3部分。
      前面介绍了策略模式用来解决的问题,下面具体给出策略的定义。策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
  2. 策略模式的实现
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. 策略模式的适用场景

在下面的两种情况下可以考虑使用策略模式:

1.一个系统需要动态地在几种算法中选择一种的情况下。那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口。
2.如果一个对象有很多的行为,如果不使用合适的模式,这些行为就只好使用多重的if-else语句来实现,此时,可以使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象涉及的概念。

  1. 策略模式的优缺点

策略模式的主要优点有:

1.策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
2.易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。
3.避免使用多重条件选择语句,充分体现面向对象设计思想。

策略模式的主要缺点有:

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这点可以考虑使用IOC容器和依赖注入的方式来解决,关于IOC容器和依赖注入(Dependency Inject)的文章可以参考:IoC 容器和Dependency Injection 模式。
策略模式会造成很多的策略类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想家NO1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值