C#使用策略模式或者委托替代多IfElse判断和Switch语句
创始人
2024-03-17 02:47:58

  这篇文件介绍使用设计模式中的策略模式和委托来解决多个IfElse判断语句和Switch语句,这种替换方式在其他语言也一样可以做到,比如PHP、JavaScript、Python或者Java等。

  这里以C#为例进行演示。

  需要为一个程序编写计算方法,根据标签名称来决定不同的计算,大体意思如下:

if(标签名=="值1"){return sum(标签数据,附加标签数据);
}
if(标签名=="值2"){return max(标签数据,附加标签数据);
}
if(标签名=="值3"){return min(标签数据,附加标签数据);
}
if(标签名=="值4"){return 标签数据*blc+附加标签数据;
}
if(标签名=="值5"){return 标签数据+附加标签数据*blc;
}
......
if(标签名=="值21"){return 计算方法21;
}

  或者使用Switch语句:

switch(标签名){case "值1":return sum(标签数据,附加标签数据);break;case "值2":return max(标签数据,附加标签数据);break;case "值3":return min(标签数据,附加标签数据);break;......case "值21":return 计算方法21;break;default:return 0;break;
}

  因为设备很多,有很多没有列出的标签,后面可能增加的标签最多的时候有20多种,那么这个地方使用这样的方式就很不合适了。

  需要针对这些代码进行重构

  先使用策略模式进行重构,再使用委托进行更加简明的重构。

  针对这种问题容易想到的是设计模式中的策略模式,策略模式比较简单,我们可以将这部分计算封装在一个DLL文件中,在程序中调用,这样增加算法可以不必须改动主程序代码。

  1、使用策略模式进行改写

  策略模式就是封装算法,让算法独立于客户的使用,一般是在确定算法时直接调用对应的算法,我们可以进行改进,生产一个算法列表供选择。

  主要是策略模式加算法列表,代码如下:

  算法类:

    public abstract class YQCYFormula{protected List InterListA;protected List AddonListA;protected double RatioA;public string FormulaNameA;public void SetData(List InterList, List AddonList, double Ratio){this.InterListA = InterList;this.AddonListA = AddonList;this.RatioA = Ratio;}public abstract double GetResult();}public class GetMax:YQCYFormula{public GetMax(){base.FormulaNameA= "最大值";}public override double GetResult(){double DResult = (this.InterListA.Union(AddonListA).ToList()).Max();DResult = Math.Round(DResult, 2);return DResult;}}public  class GetMin : YQCYFormula{public GetMin(){base.FormulaNameA = "最小值";}public override double GetResult(){double DResult = (this.InterListA.Union(AddonListA).ToList()).Min();DResult=Math.Round(DResult,2);return DResult;}}public class GetSum : YQCYFormula{public GetSum(){base.FormulaNameA = "总和";}public override double GetResult(){double DResult = this.InterListA.Sum() + this.AddonListA.Sum();DResult = Convert.ToDouble(DResult.ToString("#0.00"));return DResult;}}public class GetAverage : YQCYFormula{public GetAverage(){base.FormulaNameA = "平均值";}public override double GetResult(){double DResult = (this.InterListA.Sum() + this.AddonListA.Sum()) / (this.InterListA.Count + this.AddonListA.Count);DResult = Convert.ToDouble(DResult.ToString("#0.00"));return DResult;}}

  实际应用:

        ArrayList DictFormula = new ArrayList();//算法列表YQCYFormula MyFormula;//算法实例//注册算法MyFormula = new GetMax();DictFormula.Add(MyFormula);MyFormula = new GetMin();DictFormula.Add(MyFormula);MyFormula = new GetSum();DictFormula.Add(MyFormula);MyFormula = new GetAverage();DictFormula.Add(MyFormula);

  使用:

        double Ratio = 0.1;List InterList = new List();List AddonList = new List();Ratio = 0.1;InterList = new List { 1.1, 2.2, 3, 3, 4.4, 5.5 };AddonList = new List { 1.5, 2.5, 3.5, 4.5 };textBox1.Text += comboBox1.Text+":"+ GetResult(comboBox1.Text, InterList,AddonList,Ratio).ToString()+Environment.NewLine;

  因为算法是在独立的,这样如果有了新的算法,只需要增加算法并注册,调用程序并不需要改变,结果如下。

  2、使用委托来改写。

  主要使用算法字典和委托进行,代码如下:

  定义算法字典:

        Dictionary DictCalculation = new Dictionary();

  定义算法:

        public delegate double FormulaYQCY(List InterList, List AddonList, double Ratio);public FormulaYQCY MyFormula;private double FormulaMax(List InterList,List AddonList,double Ratio){double DResult = (InterList.Union(AddonList).ToList()).Max();DResult = Math.Round(DResult, 2);return DResult;}private double FormulaMin(List InterList, List AddonList,double Ratio){double DResult = (InterList.Union(AddonList).ToList()).Min();DResult = Math.Round(DResult, 2);return DResult;}private double FormulaSum(List InterList, List AddonList, double Ratio){double DResult = InterList.Sum() + AddonList.Sum();DResult = Convert.ToDouble(DResult.ToString("#0.00"));return DResult;}private double FormulaAverage(List InterList, List AddonList, double Ratio){double DResult = (InterList.Sum() + AddonList.Sum()) / (InterList.Count + AddonList.Count);DResult = Convert.ToDouble(DResult.ToString("#0.00"));return DResult;}

  注册算法:

            MyFormula = FormulaMax;DictCalculation.Add("最大值", MyFormula);MyFormula = FormulaMin;DictCalculation.Add("最小值", MyFormula);MyFormula = FormulaSum;DictCalculation.Add("总和", MyFormula);MyFormula = FormulaAverage;DictCalculation.Add("平均值", MyFormula);

  使用:

            double DoubleReslut = 0.0;double Ratio = 0.1;List InterList = new List { 1.1, 2.2, 3, 3, 4.4, 5.5 };List AddonList = new List { 1.5, 2.5, 3.5, 4.5 };foreach (var item in DictCalculation){if (item.Key == comboBox1.Text){MyFormula = item.Value as FormulaYQCY;DoubleReslut = MyFormula(InterList, AddonList, Ratio);textBox1.Text += comboBox1.Text+":" + DoubleReslut.ToString()+Environment.NewLine;}}

  实际输出:

   在实际编写代码过程中,有了字典或者列表,一般情况下我们已经可以不再使用多If...else语句或者Switch语句来进行分支判断输出,代码和程序的灵活性也明显增加了。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...