设计模式之策略模式

  从字面上理解,策略即为对多种情况的选择,每种情况都代表一种策略。不同策略进行独立封装,互不影响,且可相互替换,由外部选择具体的策略,达到策略替换的目的。

比如电商中对商品打折,可以打九折,可以减免运费,可以减免固定金额,这些分别表示不同的策略,最终根据不同的情况选择不同的折扣方式(策略),达到商品优惠的目的。

或者出行,我们可以选择骑车、开车、飞机。。。

下面列出策略模式的UML

Strategy:策略的抽象类或接口

StrategyA/StrategyB: 策略的具体实现

Context:策略上下文,持有Strategy抽象,通过调用Strategy的方法,达到不同策略的切换

下面我们使用策略模式来实现两个数的加减功能

定义策略抽象

    public interface Strategy
    {
        int Operate(int num1,int num2);
    }

定义具体策略实现相加、相减策略

   public class AddStrategy : Strategy
    {
        public int Operate(int num1, int num2)
        {
            return num1 + num2;
        }
    }

    public class SubtractStrategy : Strategy
    {
        public int Operate(int num1, int num2)
        {
            return num1 - num2;
        }
    }

定义策略上下文

   public class StrategyContext
    {
        private Strategy _strategy;

        public StrategyContext(Strategy strategy)
        {
            _strategy = strategy;
        }

        public int Cal(int num1, int num2)
        {
            return _strategy.Operate(num1, num2);
        }
    }

看客户端对策略的使用

   public class StrategyClient
    {
        public void Excute()
        {
            int num1 = 8;
            int num2 = 5;
            //相加策略
            Strategy strategy = new AddStrategy();
            var context = new StrategyContext(strategy);
            var result = context.Cal(num1, num2);            
        }
    }

策略模式关注于对不同算法的封装,不会实现对具体策略的选择(由外部调用者选择),不同算法之间可以相互替换。从设计上满足了开闭原则,新增其它算法,只要添加

新类就可以了,不会影响之前的实现。可以在客户端搭配工厂模式,动态创建不同策略,减少对客户端的修改。

原文地址:https://www.cnblogs.com/oneheart/p/9147562.html