一、目的:
策略模式主要是用来封装算法的,当需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
二、策略模式的原理:
一个策略类→在构造函数中传参,直接判断需要生成哪个子类;并且在另一个方法中调用指定子类的方法(完成不同的算法、业务规则……,这个方法对主程序无需知道)。
三、拿商场结账时打折和满增的例子来实现代码:
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类中调用了,主程序中根本不知道有这么一件事件,封装性比较好);使用策略模式在主程序中不像简单工厂模式一样需要认识两个类,而只需认识一个策略类即可,耦合性大大的提高。
分享到:
相关推荐
设计模式只是为Java架构师准备的——至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在PHP应用程序中非常有用?本文解释...
透析模式学习.pptx
详细剖析在软件体系结构中设计模式的体现和设计原则应用,归纳设计原则,重描设计模式,,CLASSIC
透析手机电视商业模式.pdf
私募基金运作模式透析
基于远程监控系统的自动化腹膜透析患者联合照护模式的构建与实践研究.pdf
医疗失效模式与效应分析模式应用于血液透析患者感染控制中的效果分析.pdf
私募基金运作模式透析.pdf
自动化腹膜透析在危重症腹膜透析患者应用中的护理体会.pdf
铁剂在慢性透析病人中应用PPT课件.pptx
私募基金运作模式透析实用.pdf
高校教材管理新模式透析.doc
智能腹膜透析机的嵌入式系统设计pdf,智能腹膜透析机的嵌入式系统设计
比较透析当前风险投资组织模式.doc
医疗失效模式与效应分析在血液透析患者体重管理中的应用.pdf
人工智能在血液透析中的监测及预测应用进展.pdf
工业企业建设状况与策略透析.doc
互联网健康教育模式在血液透析患者新瘘使用中的运用.pdf
费森尤斯透析机维修ppt,主要介绍4008s透析机水路部件及维修指南
自营渠道模式透析及其成本控制.doc