我是靠谱客的博主 小巧月饼,最近开发中收集的这篇文章主要介绍策略模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

策略模式

  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 模式。
策略模式会造成很多的策略类。

最后

以上就是小巧月饼为你收集整理的策略模式的全部内容,希望文章能够帮你解决策略模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部