设计模式之策略模式
2016-04-30 21:06
337 查看
背景:
商场经常会搞促销活动,需要做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。分析:
商场收银时如何促销,用打折或是返利其实都是一些算法,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的策略模式:它定义了一个算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
结构图:
代码:
现金收费抽象类:abstract class CashSuper { public abstract double acceptCash(double money); }正常收费:
class CashNormal:CashSuper { //正常收费,原价返回 public override double acceptCash(double money) { return money; } }打折收费:
/// <summary> /// 打折收费 /// </summary> class CashRebate:CashSuper { private double moneyRebate = 1d; public CashRebate(string moneyRebate) { this.moneyRebate = double.Parse(moneyRebate); } public override double acceptCash(double money) { return money * moneyRebate; } }返利收费:
/// <summary> /// 返利收费子类 /// </summary> class CashReturn : CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; 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; } }CashContext类
/// <summary> /// CashContext类 /// </summary> class CashContext { private CashSuper cs; //声明一个CashSuper对象 public CashContext (CashSuper csuper) { this.cs = csuper; } public double GetResult(double money) { return cs.acceptCash(money ); } }
Form窗体代码:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } double total = 0.0d; //用于总计 private void btnOk_Click(object sender, EventArgs e) { CashContext cc = null; switch (cbxType .SelectedItem .ToString ()) { case "正常收费": cc = new CashContext(new CashNormal()); break; case "满300返100": cc =new CashContext (new CashReturn ("300","100")); break; case "打8折": cc = new CashContext(new CashRebate("0.8")); break; } double totalPrices = 0d; totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text)); total = total + totalPrices; lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + " " + cbxType.SelectedItem + "合计:" + totalPrices.ToString()); lalResult.Text = total.ToString(); } private void Form1_Load(object sender, EventArgs e) { cbxType.Items.AddRange(new object[] { "正常收费", "满300返100", "打8折" }); cbxType.SelectedIndex = 0; } private void btnreset_Click(object sender, EventArgs e) { txtPrice.Clear(); txtNum.Clear(); lalResult.Text = ""; cbxType.SelectedIndex = 0; lbxList.Items.Clear(); } }
总结:
每个模式都有它的精华之处,需要我们好好理解它的奇妙之处!相关文章推荐
- 白盒测试(程序流程图)
- IOC初识
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
- 开源生物特征识别库 OpenBR
- 1049. 数列的片段和(20)
- Android View 事件分发机制源码详解(ViewGroup篇)
- MOOC的Python笔记(一)基本语法
- Lambda expressions , Action , Func and Predicate
- 禁忌搜索基础知识
- Java 之 线程和进程
- Lightoj--1338--Hidden Secret!(模拟)
- Axure制作ipad原型
- 10个值得深思的 PHP 面试问题
- Boost.log的应用
- bootstrap表单验证插件 经验记录 与RSA加密事件配合修改
- leetcode151: symmetric tree
- 1048. 数字加密(20)
- C经典 快速实现加减乘除
- 第二次打字测试
- jquery操作DOM元素的复习