从字面上理解,策略即为对多种情况的选择,每种情况都代表一种策略。不同策略进行独立封装,互不影响,且可相互替换,由外部选择具体的策略,达到策略替换的目的。
比如电商中对商品打折,可以打九折,可以减免运费,可以减免固定金额,这些分别表示不同的策略,最终根据不同的情况选择不同的折扣方式(策略),达到商品优惠的目的。
或者出行,我们可以选择骑车、开车、飞机。。。
下面列出策略模式的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); } }
策略模式关注于对不同算法的封装,不会实现对具体策略的选择(由外部调用者选择),不同算法之间可以相互替换。从设计上满足了开闭原则,新增其它算法,只要添加
新类就可以了,不会影响之前的实现。可以在客户端搭配工厂模式,动态创建不同策略,减少对客户端的修改。