策略模式

本文介绍了策略模式,书上定义其封装家族算法可相互替换,作者理解为对算法包装,将使用与算法本身分割。阐述了用法,包括使用场景、方法、重点,分析了优缺点,还给出UML图和相关例子。最后以商场打折为例给出代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,解释:

1,书上的解释:

策略模式定义了家族算法,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不回影响到使用算法的客户。

2,自己的理解:

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理(属于行为型模式)

二,用法:

1,什么时候用?

一个系统有很多很多类,而且唯一能够区分它们的就是他们自己的行为的时候

2,如何用?

将这些算法封装为一个一个的类,任意替换

3,重点是什么?

策略模式有三个主要的角色:抽象策略,具体策略,环境类(环境类用于引用)

4, UML图

5,优缺点是什么?

(1)优点:

扩展更加方便

可以自由切换算法

(2)缺点:

会有很多的具体策略类

6,相关的例子

(1)让厨子做什么菜品,他就会做什么,都会有相应的一个做菜的策略

(2)关于商场打折,当季衣服不打折,上一季衣服大致力度很大

三,代码:

1,商场打折为例子:

先有一个抽象现金类,写出具体类都共有的方法:

abstract  class CashSuper//抽象现金类
    {
        public abstract double acceptCash(double money);      
    }

2,几种不同的促销活动的打折力度的类:没有折扣——打折——满几百返几百

 class CashNomal: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 moneyConsition = 0.0d;
        private double moneyReturn = 0.0d;
        public CashReturn(string moneyConsition,string moneyReturn)
        {
            this.moneyConsition = double.Parse(moneyConsition);
            this.moneyReturn = double.Parse(moneyReturn);
        }
        public override double acceptCash(double money)
        {
            double result = money;
            if (money >= moneyConsition)
                result = money - Math.Floor(money / moneyConsition) * moneyReturn;
            return result ;
        }
    }

3,具体的策略:包装所有的行为,利用context的 构造函数来来连接到抽象类,并算钱

class CashContext
    {
        private CashSuper cs;
        public CashContext (CashSuper csuper)
        {
            this.cs = csuper;
        }
        public double getresult(double money)
        {
            return cs.acceptCash(money);
        }
        }

4,客户端:(有窗体)

 double total = 0.0d;
        private void button1_Click(object sender, EventArgs e)
        {
            CashContext cc = null;
            switch (comboBox1 .SelectedItem.ToString ())
            {
                case "正常消费":
                    cc = new CashContext(new CashNomal());
                    break;
                case "满300减100":
                    cc = new CashContext(new CashReturn("300", "100"));
                    break;
                case "打8折":
                    cc = new CashContext(new CashRebate("0.8"));
                    break;

                    double totalPrice = 0d;
                    totalPrice = cc.getresult(Convert.ToDouble(textBox1.Text) * Convert.ToDouble(textBox2.Text));
                    totalPrice = totalPrice + total;
                    listBox1.Items.Add("单价" + textBox1 + "数量" + textBox2 + "种类" + comboBox1 + "合计" + totalPrice);
                    label5.Text = total.ToString();
            }
        }

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值