欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式——策略模式

程序员文章站 2024-02-07 19:29:04
...

初识设计模式,感觉学习起来有点吃力,不过小菜和大鸟的对话还是挺有意思的,感觉自己就是那个小菜,今天我学习了策略模式,策略模式感觉比简单工厂模式又难了一点,但是通过小菜和大鸟的对话还是能懂点,废话不多说,下面我就来讲解一下策略模式!

策略模式是什么?

它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户!
举例:
从北京到上海我们可以坐飞机,可以坐火车,可以坐高铁。这几种方法最终的目的地都是上海,起点都是北京,只不过是我们用不同的交通工具,这里的交通工具其实就是不同的算法

策略模式必须要有以下三种策略角色:
抽象策略角色(strategy):通常由一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。用来约束一些列具体的策略算法,策略上下文角色使用此策略接口来调用具体的策略所实现的算法**—— 相当于父类**

具体策略角色(ConcreteStrategyA、B、C):包装了相关算法和行为,相当于子类

环境角色(Context):持有 一个策略类的引用,最终给客户端调用。策略上下文,负责和具体的策略实现交互,通常策略上下文对象会持有一个真正的策略实现对象,策略上下文还可以让具体的策略实现从其中获取相关数据,回调策略上下文对象的方法。

UML图如下:
设计模式——策略模式
举例:某商场进行促销活动,分别有以下三种方式进行促销,打8折、满300返100,按原价销售。

解说:这个方案的最终结果就是要让商品卖出去,三种方法相当于三种策略,收钱是一个抽象类,相当于一个父类,而正常收费、打8折和满300返100的活动都是继承收钱这个父类,这三个相当于具体策略角色。
UML图如下所示:
设计模式——策略模式

具体代码如下:

抽象策略类:

 abstract class CashSuper
        {
    
            public abstract double acceptCash(double money);
    
        }

具体策略角色:

//正常收费子类
    class CashNormal1 : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;
        }
    }
    //打折收费子类
    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;
        }

    }
    //返利收费子类
    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 resultl = money;
            if (money >= moneyCondition)
            {
                resultl = money - Math.Floor(money / moneyCondition) * moneyReturn;

            }
            return resultl;
        }
    }

环境策略角色

 class CashContext 
    {
        CashSuper cs = null;
        public CashContext(string type)
        {
            switch(type)
            {
                case "正常收费":
                    CashNormal1 cs0 = new CashNormal1();
                    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;

            }
        }
        public double GetResult(double money)
        {
            return cs.acceptCash(money);
        }
    }

客户端代码

 double total = 0.0d;
        private void btnOK_Click(object sender, EventArgs e)
        {
            {

                CashContext csuper = new CashContext(cboType.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 + " " + cboType.SelectedItem + "合计:" + totalPrices.ToString());
                lblResult.Text = total.ToString();
            }
        }

以上就是我对策略模式的理解,有什么不对的地方请大家多多指点!