策略模式重构switch/case分支代码

通过策略模式来重构优化代码里面的switch/case分支代码。极大程度上提高了程序的扩展性。当然,如果分支比较多,每次都需要新增加一个类,这的确是有点麻烦,可以考虑使用反射来实现。
代码:

namespace DP
{
    public enum State
    {
        Alaska,
        NewYork,
        Florida
    }

    // 抽象
    //public interface IShippingInfo
    //{
    //    decimal Calculate(State state);
    //}

    public class CalculateShippingAmount
    {
        public CalculateShippingAmount(IDictionary<State, IGetShippingAmount> dic) => _dic = dic;

        private IDictionary<State, IGetShippingAmount> _dic { get; set; }

        public decimal Calculate(State state) => _dic[state].GetAmount();
    }

    public interface IGetShippingAmount
    {
        decimal GetAmount();
    }

    #region 具体地址的实现
    // 具体
    public class GetAlaskaShippingAmount : IGetShippingAmount
    {
        public decimal GetAmount() => 15;
    }

    public class GetNewYorkShippingAmount : IGetShippingAmount
    {
        public decimal GetAmount() => 10;
    }

    public class GetFloridaShippingAmount : IGetShippingAmount
    {
        public decimal GetAmount() => 3;
    }
    #endregion

}

调用:

#region 策略模式重构 switch...case...
        static void SwitchToStrategy()
        {
            var dic = new Dictionary<State, IGetShippingAmount>
            {
                {State.Alaska,  new GetAlaskaShippingAmount() },
                {State.Florida, new GetFloridaShippingAmount() },
                {State.NewYork, new GetNewYorkShippingAmount() }
            };

            var calculate = new CalculateShippingAmount(dic);
            var result = calculate.Calculate(State.Florida);
            Console.WriteLine($"{State.Florida.ToString()}返回{result}");
        }
        #endregion

参考:使用策略模式重构switch case 代码

原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/10981236.html

时间: 2024-11-05 22:55:19

策略模式重构switch/case分支代码的相关文章

设计模式之策略模式(iOS开发,代码用Objective-C展示)

在实际开发过程中,app需求都是由产品那边给出,往往是他给出第一版功能,我们写好代码后,会相应的给出第二版.第三版功能,而这些功能是在实际使用中,根据用户需求而不断增加的.如果在编码之初,我们并未认识到这一点,并未后续添加的代码做好相应的设计准备,那么无疑,这个项目代码会越来越乱,就会导致这样一个循环: 产品提需求 我根据需求写代码 产品增加需求 为了在规定时间内完成任务,我根据需要增加的需求增加代码(由于没有思考好相应的设计,使得代码又长又乱) 产品再增加需求 我再增加代码,由于前面代码设计不

js中switch/case分支的值可以是变量或表达式

在一些高级语言如C#中,switch分支的值只能是常量,而js中可以是变量或表达式: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.

利用策略模式优化过多 if else 代码

前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //doshomething }else if(c){ //doshomething } else{ ////doshomething } 条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错. 比如这样: 摘自 cim 中的一个客户端命令的判断条件. 刚开始条件较少,也就没管那么多直接写

小酌重构系列[15]&mdash;&mdash;策略模式代替分支

前言 在一些较为复杂的业务中,客户端需要依据条件,执行相应的行为或算法.在实现这些业务时,我们可能会使用较多的分支语句(switch case或if else语句).使用分支语句,意味着"变化"和"重复",每个分支条件都代表一个变化,每个分支逻辑都是相似行为或算法的重复.当追加新的条件时,我们需要追加分支语句,并追加相应的行为或算法. 上一篇文章"使用多态代替条件判断"中,我们讲到它可以处理这些"变化"和"重复&qu

重构:越来越长的 switch ... case 和 if ... else if ... else

在代码中,时常有就一类型码(Type Code)而展开的如 switch ... case 或 if ... else if ... else 的条件表达式.随着项目业务逻辑的增加及代码经年累月的修改,这些条件判断逻辑往往变得越来越冗长.特别是当同样的逻辑判断出现在多个地方的时候(结构示意如下),代码的可读性和维护难易程度将变得非常的糟糕.每次修改时,你必须找到所有有逻辑分支的地方,并修改它们. 1 switch(type) 2 { 3 case "1": 4 ... 5 break;

【2-23】分支语句(switch…case)及循环语句

Switch-case分支语句与if语句作用相同,但需将情况都罗列出比较麻烦所以不常用. 其基本结构是: Switch(一个变量值) { Case 值1:要执行的代码段:break; Case 值2:要执行的代码段:break; --. Default:(否则) 要执行的代码段:break: } 循环语句 循环语句主要有for/while/foreach 循环语句的结构可分为四部分即四要素:初始条件,循环条件,循环体,状态改变 结构为: for(初始条件:循环条件:状态改变) { 循环体 } 例

c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数据类型, 还有BOO数据类型, 以及一些其它的数据类型, 如自定义的结构体数据类型 BOOL数据类型是一种表示非真即假的数据类型, 布尔类型的变量只有YES和NO两个值. YES表示表达式结构为真, 反之, NO表示表达式结果为假(在c语言中, 认为非0即为真), BOOL类型主要用与分支结构或循环

js --策略模式

策略模式的定义: 将算法一个个的单独进行封装,并且使他们可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的is-else语句进行判断,或者使用switch语句,在后期添加新的需求的时候,比较头疼的需要去改这些判断语句,而且有时候会,添加一条判断语句,一不小心会导致所有的判断都失效呢?举一个之前项目中用到的例子把,简化一下.有一个按钮在不同的条件下,跳转到不同的页面,如下: toseeHouse() {

JavaScript设计模式 策略模式

在现实中,我们到达一个地方,通常可以选择不同的方式,例如自行车,火车,汽车,飞机等. 在程序设计中,通常也会有这样的情况,实现一个功能有多个方案可以选择,比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法. 而这种情况,在设计模式中,称为策略模式. 策略模式的定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 例子: 很多公司的年终奖是根据员工的工资基数和年底绩效情况来方法的.如S级绩效为4倍工资,A级有3倍工资,B级有两倍工资. 在不使用策略模式的情况下,