首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2012-08-11 
透析设计模式中的 策略模式一、目的:策略模式主要是用来封装算法的,当需要在不同时间应用不同的业务规则,就

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

一、目的:

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

二、策略模式的原理:      一个父类,下面有几个子类继承父类实现多态      一个策略类→在构造函数中传参,直接判断需要生成哪个子类;并且在另一个方法中调用指定子类的方法(完成不同的算法、业务规则……,这个方法对主程序无需知道)。 三、拿商场结账时打折和满增的例子来实现代码: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类中调用了,主程序中根本不知道有这么一件事件,封装性比较好);使用策略模式在主程序中不像简单工厂模式一样需要认识两个类,而只需认识一个策略类即可,耦合性大大的提高。

 

热点排行