【设计模式】——策略模式(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
原创粉丝点击