设计模式——策略模式

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

策略模式是什么?

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

策略模式必须要有以下三种策略角色:
抽象策略角色(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();
            }
        }

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值