大话设计模式读书笔记2——策略模式
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合。
UML 图:
根据《大话设计模式》——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式:

/// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> /// 现金收取超类抽象方法收取现金 /// </summary> /// <param name="money">原价</param> /// <returns>当前价格</returns> public abstract double acceptCash(double money); }

/// <summary> /// 正常收费子类 /// </summary> public class CashNormal : CashSuper { public override double acceptCash(double money) { return money; } } /// <summary> /// 打折收费子类 /// </summary> public class CashRebate : CashSuper { private double moneyRebate = 1d; public CashRebate(string moneyRebate) { //打折收费,初始化时,必须需要输入折扣率,如八折就是 0.8 this.moneyRebate = double.Parse(moneyRebate); } public override double acceptCash(double money) { return money * moneyRebate; } } /// <summary> /// 返利收费子类 /// </summary> public class CashReturn : CashSuper { private double moneyCondition = 0.0d; private double moneyRetrun = 0.0d; public CashReturn(string moneyCondition,string moneyReturn) { //返利收费,初始化时候必须要输入返利条件和返利值,比如满 //300返回100,则moneyCondition为300,moneyReturn为100 this.moneyCondition = double.Parse(moneyCondition); this.moneyRetrun = double.Parse(moneyReturn); } public override double acceptCash(double money) { double result = money; if (money >=moneyCondition) { result = money - Math.Floor(money / moneyCondition) * moneyRetrun; } return result; } }

/// <summary> /// 上下文类 /// </summary> public class CashContext { CashSuper cs = null; public CashContext(string type) { switch (type) { case "正常收费": CashNormal cs0 = new CashNormal(); this.cs = cs0; break; case "满300返100": CashReturn cs1 = new CashReturn("300","100"); this.cs = cs1; break; case "打8折": CashRebate cs2 = new CashRebate("0.8"); this.cs = cs2; break; } } public double GetResult(double money) { return cs.acceptCash(money); } }
客户端代码:
void btnOk_Click(object sender, EventArgs e) { CashContext csuper = new CashContext(this.cbxType.Text); double totalPrices = 0d; totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text)); total = total + totalPrices; lbxList.Items.Add("单价: " + txtPrice.Text + " 数量: " + txtNum.Text + " " + cbxType.Text + " 合计: " + totalPrices.ToString()); this.lblTotal.Text = total.ToString(); }
界面截图:
作者:Rising Sun
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库