大话设计模式-策略模式-2020-09-15-周二

2020-09-16  本文已影响0人  松哥888

定义

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

image.png
  • 算法之间可以互相调用
  • 策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
    比如出行方式,商场打折等等,都可以用策略模式来封装。

大话设计模式第二章之:策略模式

代码实现

    public abstract  class Strategy
    {
        public abstract void AlgorithmInterface();
    }
    public class ConcreteStrategy1 : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法1的实现");
        }
    }

    public class ConcreteStrategy2 : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法2的实现");
        }
    }

    public class ConcreteStrategy3 : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法3的实现");
        }
    }
    public class Context
    {
        Strategy strategy;
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }

        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Context context;

            context = new Context(new ConcreteStrategy1());
            context.ContextInterface();

            context = new Context(new ConcreteStrategy2());
            context.ContextInterface();

            context = new Context(new ConcreteStrategy3());
            context.ContextInterface();

            Console.ReadLine();
        }
    }
策略调用.png

设计模式之五(策略模式)

商场促销的例子

策略与简单工厂结合,把子类创建移到环境类中,直接用字符串来调用各种不同的策略。这样,客户端就不需要知道具体的算法类了。

image.png
abstract class CashSuper {
    public abstract double acceptCash(double money);
}
class CashNormal extends CashSuper {
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
class CashRebate extends CashSuper {
    //折扣
    private double moneyRebate = 1;

    // 类初始化的时候设置折扣率 0 ~ 1
    public CashRebate(double moneyRebate) {
        if (moneyRebate > 1) {
            this.moneyRebate = 1;
            return;
        }
        if (moneyRebate < 0) {
            this.moneyRebate = 0;
            return;
        }
        this.moneyRebate = moneyRebate;
    }

    @Override
    public double acceptCash(double money) {
        return money * this.moneyRebate;
    }
}
class CashReturn extends CashSuper {
    private double moneyConditation = 0.0;    //返利条件
    private double moneyReturn = 0.0d;    //返利值

    public CashReturn(double moneyConditation, double moneyReturn) {
        this.moneyConditation = moneyConditation;
        this.moneyReturn = moneyReturn;
    }

    @Override
    public double acceptCash(double money) {
        double result = money;

        if (money >= moneyConditation) {
            result = money - Math.floor(money / moneyConditation) * moneyReturn;
        }

        return result;
    }
}
class CashContext {
    private CashSuper cashSuper = null;

    // 根据文字创建,相当于简单工厂
    CashContext(String type) {
        switch (type) {
            case "正常收费":
                cashSuper = new CashNormal();
                break;
            case "满300返100":
                cashSuper = new CashReturn(300, 100);
                break;
            case "打8折":
                cashSuper = new CashRebate(0.8);
                break;
            default:
                cashSuper = new CashNormal();
                break;
        }
    }

    public double getResult(double money) {
        return cashSuper.acceptCash(money);
    }
}
    public void onReturnButtonClick(View view) {
        doCash("满300返100");
    }

    public void onRebateButtonClick(View view) {
        doCash("打8折");
    }

    public void onNormalButtonClick(View view) {
        doCash("普通收费");
    }

    private void doCash(String type) {
        try {
            double price = Double.parseDouble(priceEditText.getText().toString());
            int count = Integer.parseInt(countEditText.getText().toString());
            double money = price * count;
            CashContext cashContext = new CashContext(type);
            double result = cashContext.getResult(money);
            this.totalTextView.setText(String.valueOf(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
普通 打8折 满300返100

简说设计模式——策略模式

Demo地址

https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

上一篇 下一篇

猜你喜欢

热点阅读