一、目的:
策略模式主要是用来封装算法的,当需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
二、策略模式的原理:
一个策略类→在构造函数中传参,直接判断需要生成哪个子类;并且在另一个方法中调用指定子类的方法(完成不同的算法、业务规则……,这个方法对主程序无需知道)。
三、拿商场结账时打折和满增的例子来实现代码:
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. **商业模式定义**:商业模式是指企业如何...
【对冲基金商业模式深度透析】 对冲基金的商业模式是一个复杂而重要的议题,尤其是在金融行业中。这份由美林证券发布的万字报告详细分析了对冲基金行业在2011年的转折点及其后续影响。2011年,对冲基金遭遇了小型...
财政发展在体育馆发展模式中的作用与影响 体育馆作为体育事业的重要组成部分,其建设和运营与财政政策密切相关。财政视角下的体育馆发展模式,主要关注政府投入、市场化运作、公共资金利用效率以及体育馆的社会效益...
在互联网技术的辅助下,传统的医疗护理方式得到了革新,特别是在一些需要长期治疗和护理的患者群体中,如维持性血液透析患者。 维持性血液透析是终末期肾病(ESRD)患者主要的替代治疗手段之一,它能够帮助患者清除...
5. **竞品分析**:大数据也可以用于分析竞争对手的策略,洞察竞品的优势和弱点,帮助“大红鹰”在竞争中占据有利位置。 6. **销售预测**:基于历史销售数据和市场趋势,大数据模型可以预测未来的销售情况,帮助企业...
研究采用前瞻性队列设计,选取了兰州大学第二医院肾内科的CKD非透析患者,并将他们分为管理组(接受MDC管理)和对照组(传统管理模式)。研究的主要终点是患者进入终末期肾脏病(End Stage Renal Disease,ESRD)或...
总结而言,血液透析导管行业的企业要想在激烈的市场竞争中突围,必须具备清晰的战略定位,不断创新,并制定有效的市场推广策略。只有这样,才能在未来的五年内实现稳健的增长,稳固市场地位,甚至引领行业的发展方向...
- 卖场设计模式则关乎店面布局和陈列策略,需考虑顾客购物习惯、商品类别以及品牌形象等因素,以提高顾客的购物体验和转化率。 2. **零售商管理模式透析与对策**: - 分销卖入问题分析:供应商应深入了解KA(Key ...
对于上述各种报警,维修人员可通过诊断模式中的输出写入功能测试相关电磁阀的吸合动作,确认其功能是否正常。一旦确定问题所在,可以针对性地更换或修复相应部件,以恢复设备的正常运行。 【结论】 费森尤斯4008B...
在血透(血液透析)这个特定场景中,FMEA有助于识别可能导致患者感染的风险因素,并制定相应的控制策略。 描述中提到的是FMEA在血透患者感染控制中的应用。血液透析是治疗慢性肾病的重要手段,但因为涉及血液暴露,...
【战略成本管理框架透析】 战略成本管理是现代企业应对日益激烈的市场竞争和高新技术发展变化的必然选择。传统成本管理模式,以标准成本为核心,基于直接材料、直接人工和制造费用的分摊,已无法满足现代企业的战略...
标题中的“F:\考研英语\考研英语阅读命题思路透析和真题揭秘\阅读.rar”表明这是一个关于考研英语阅读理解的压缩文件,其中包含了对考研英语阅读部分的深入解析和历年真题。这个压缩包的核心内容是“阅读.doc”,很...
房地产商在营销策略上往往过于追求短期效益,轻视前期的规划设计,导致产品质量问题频出。例如,有的开发商选择低价设计单位,结果在实际施工中出现问题,反而增加了后期营销推广的成本。此外,过度依赖环境包装,如...
这篇论文主要探讨了在消费行为下体育消费品购买决策的透析,主要关注了以下几个关键知识点: 1. **体育消费态度**:体育消费态度是影响消费者生活方式的重要因素,它调节着外部体育商品对个体的刺激影响,并进而...
《九号公司-689009-从国内到海外,深度透析公司电动两轮车业务成长逻辑》这份报告详细阐述了九号公司在电动两轮车领域的业务发展策略和逻辑,揭示了其从国内市场走向全球市场的历程与挑战。在当前环保意识日益提升和...
标题中的“从220KV线路故障跳闸事件透析高频保护的不足全年线路故障跳闸趋势”揭示了本文档的核心内容,它涉及到电力系统中220千伏输电线路的故障跳闸问题,以及高频保护(High Frequency Protection)在这种故障...