透析设计模式中的 策略模式

一、目的:

      策略模式主要是用来封装算法的,当需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

二、策略模式的原理:
      一个父类,下面有几个子类继承父类实现多态
      一个策略类→在构造函数中传参,直接判断需要生成哪个子类;并且在另一个方法中调用指定子类的方法(完成不同的算法、业务规则……,这个方法对主程序无需知道)。
 
三、拿商场结账时打折和满增的例子来实现代码:
1.商场结算的抽象类
    public abstract class CashSuper
    {
        public CashSuper()
        {
        }
        public abstract double GetRealPrice(double money);
    }
 
2.正常收费子类,继承CashSuper类
    public class CashNormal : CashSuper
    {
        public CashNormal()
        {
        }
        public override double GetRealPrice(double money)
        {
            return money;
        }
    }
 
3.满立减的结算类,继承CashSuper类
    public class CashReturn : CashSuper
    {
        public double CashCondition;
        public double ReturnMoney;
        public CashReturn(double cashCondition, double returnMoney)
        {
            this.CashCondition = cashCondition;
            this.ReturnMoney = returnMoney;
        }
        public override double GetRealPrice(double money)
        {
            double result=0;
            if (money > CashCondition)
            {
                result= money - Math.Floor(money / CashCondition) * ReturnMoney;
            }
            return result;
        }
    }
 
4.打折的类,继承CashSuper类
    public class CashRebate : CashSuper
    {
        public double cashRebate;
        public CashRebate(double rebate)
        {
            this.cashRebate = rebate;
        }
        public override double GetRealPrice(double money)
        {
            return money * cashRebate;
        }
    }
 
5.策略模式的核心类(结合简单工厂模式生成不同的对象)
    public class CashContext
    {
        CashSuper cs = null;
        public  CashContext(string type)//直接根据构造函数的参数来判断需要创建那个类
        {
            switch (type)
            {
                case "正常收费":
                    cs = new CashNormal();
                    break;
                case "打八折":
                    cs = new CashRebate(0.8);
                    break;
                case "满300减100":
                    cs = new CashReturn(300,100);
                    break;
                default:
                    break;
            }
        }

        public double GetRealMoney(double money)
        {
            return cs.GetRealPrice(money);//在Context类中直接调用运算,客户端无需参与无需知道
        }
    }

主程序main里面需要输入的代码:
        private void btnOK_Click_1(object sender, EventArgs e)
        {
            CashContext cc = new CashContext(comboBox1.SelectedItem.ToString());
            double totalPrice = cc.GetRealMoney(Convert.ToDouble(txtPerPrice.Text) * Convert.ToDouble(txtNumber.Text));
        }

      这里主程序只需认识策略类Context即可,连中间的方法要如何实现都不需要了解,对主程序都是封闭的。
 
      策略模式其实跟简单工厂模式差不多,只是把生产对象的类(CreateClass)改为了Context策略类,并且在策略类中结合简单工厂模式生成对应的对象,并调用不同对象的方法实现不同的算法或业务规则(这种算法或业务规则直接就在Context类中调用了,主程序中根本不知道有这么一件事件,封装性比较好);使用策略模式在主程序中不像简单工厂模式一样需要认识两个类,而只需认识一个策略类即可,耦合性大大的提高。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值