设计模式——策略模式

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

策略模式是什么?

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

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

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

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值