【设计模式】——策略模式(Strategy)
来源:互联网 发布:mac tex 编辑器 编辑:程序博客网 时间:2024/05/24 06:41
策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法发生变化,不会影响到使用算法的客户。
下面以商场收银系统为例:
现金抽象类
abstract class CashSuper { //现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价 public abstract double acceptCash(double money); }
class CashRebate : CashSuper { private double moneyRebate = 1d; public CashRebate(string moneyRebate) { this.moneyRebate = double.Parse(moneyRebate); //打折收费,初始化时,比喻要输入折扣率,如八折,就是0.8 } public override double acceptCash(double money) { return money * moneyRebate; } }
返利收费子类
class CashReturn : CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; //返利收费,初始化时必须要输入返利条件和返利值,比如满300返100,则moneyCondition为300 ,moneyReturn为100 public CashReturn(string moneyCondition, string moneyReturn) { this.moneyCondition = double.Parse(moneyCondition); this.moneyReturn = double.Parse(moneyReturn); } public override double acceptCash(double money) { double result = money; if (money >= moneyCondition)//若大于返利条件,则需要减去返利值 result = money - Math.Floor(money / moneyCondition) * moneyReturn; return result; } }
正常收费子类
class CashNormal : CashSuper { public override double acceptCash(double money) { //正常收费,原价返回 return money; } }
CashContext类
class CashContext { CashSuper cs = null; //声明一个Cashontext对象 public CashContext(string type)//注意参数不是具体的收费策略对象,而是一个字符串,表示收费类型 { switch (type ) { case "正常收费": CashNormal cs0 = new CashNormal(); cs = cs0; break; case "满300返100": CashReturn cr1 = new CashReturn("300","100"); cs = cr1; break; case "打8折": CashRebate cr2 = new CashRebate("0.8"); cs = cr2; break; } //将实例化具体策略的过程由客户端转移到Context中。简单工厂的应用 } public double GetResult(double money) { return cs.acceptCash(money); } }
客户端代码
public partial class Form1 : Form { double total = 0.0d;//用于总计 private void Form1_Load(object sender, EventArgs e) { cbxType.Items.AddRange(new object[] { "正常收费", "打8折", "满300返100" }); cbxType.SelectedIndex = 0; } private void btnOK_Click(object sender, EventArgs e) { //根据下拉选择框,将相应的算法类型字符串传入CashContext的对象中 CashContext csuper = new CashContext(cbxType .SelectedItem .ToString ()); 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 .SelectedItem +"合计:"+totalPrices .ToString ()); lblResult.Text = total.ToString(); }
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
0 0
- 设计模式——策略模式(Strategy)
- 设计模式——Strategy策略模式
- JAVA设计模式—策略模式(Strategy)
- java设计模式——策略者模式(strategy)
- 设计模式——策略模式(Strategy)
- java设计模式13——策略模式(Strategy)
- 走进设计模式之——策略模式(Strategy)
- 设计模式——策略模式(Strategy) 笔记
- 【设计模式】——策略模式(Strategy)
- C++ 设计模式 —— 策略模式(Strategy)
- 设计模式 —— 策略模式(Strategy Pattern)
- 设计模式 II ——策略模式(Strategy)
- Java设计模式——策略模式(Strategy Pattern)
- 设计模式——策略模式(Strategy Pattern)
- Java设计模式——策略模式(Strategy Pattern)
- 设计模式—策略模式(Strategy Pattern)
- Java设计模式 —— 策略(Strategy)
- Java设计模式——策略(Strategy)
- <数据结构课程设计> 学生成绩管理系统开发
- fastjson使用
- Linux常用Terminal命令與快捷鍵參考
- Python continue pass和break
- Go支持https协议的简单例子
- 【设计模式】——策略模式(Strategy)
- android studio 的奇葩环境问题
- extjs 时间控件默认时间
- 数据库中执行sql文件
- javaWeb学习笔记-----2css
- Android内存优化
- SQLMAP 实例COOKBOOK
- vmware tools安装出现的问题
- IOS给UILabel文本框增加下划线和中划线