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