策略模式(Strategy)是一种行为型模式,不一样的算法肯定了程序的不一样的行为。java
策略模式:它定义了算法家族,分别封装起来,让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户。算法
-- 《大话设计模式》设计模式
UML类图:ide
咱们的程序为了实现某个功能,可能会采起不少种算法,这些算法的目的是相同的,行为也是类似的,这样咱们就能够把这些算法抽象化为一个策略。例如上篇提到的计算器(各类运算),或者是商城的优惠系统(满X减Y),地图导航(根据出发地和目的地给出不一样的出行方式)。this
策略模式就是用来封装算法的,但在实践中,咱们发现能够用它来封装几乎任何类型的规则,只要在分析过程当中听到须要在不一样时间应用不一样的业务规则,就能够考虑使用策略模式处理这种变化的可能性。spa
-- 《大话设计模式》设计
到这里咱们发现,策略模式和简单工厂模式在某些方面是高度类似的,无论是思想上,仍是在代码层次上,不过仍是有一点细微的差异。例以下面我用到的示例计算器,经过上一节咱们不难想到简单工厂模式的实现:定义一个计算接口并定义一个计算的方法,再分别定义不一样的计算实现类,最后定义一个计算工厂类,经过给定的不一样的运算符号去决定用哪一个计算实现类。code
先介绍下策略模式是如何设计并工做的,下一节再将它与简单工厂模式作一个对比。对象
示例代码:接口
1. 建立Operation接口,并定义一个calculate的抽象方法
Operation.java
public interface Operation { int calculate(int num1, int num2); }
2. 建立实现该策略的各个实现类
OperationAdd.java
public class OperationAdd implements Operation { @Override public int calculate(int num1, int num2) { return num1 + num2; } }
OperationMinus.java
public class OperationMinus implements Operation { @Override public int calculate(int num1, int num2) { return num1 - num2; } }
3. 建立上下文类Context,并定义一个Strategy对象
Context.java
public class Context { private Operation operation; public Context(Operation calculator) { this.operation = calculator; } public int getResult(int num1, int num2) { return operation.calculate(num1, num2); } }
4. 给Context传递策略对象,来实现不一样的运算
public class StrategyPatternDemo { public static void main(String[] args) { Context c = new Context(new OperationAdd()); System.out.println("5 + 2 = " + c.getResult(5, 2)); c = new Context(new OperationMinus()); System.out.println("5 - 2 = " + c.getResult(5, 2)); } }
5. 输出:
5 + 2 = 7 5 - 2 = 3
策略模式是一种定义一系列算法的方法,从概念上来看,全部这些算法完成的都是相同的工做,只是实现不一样,它能够以相同的方式调用全部的算法,减小了各类算法类与使用算法类之间的耦合。在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
1. 上下文和具体策略是松耦合关系。所以上下文只知道它要使用某一个实现Strategy接口类的实例,但不须要知道具体是哪个类
2. 策略模式知足“开-闭原则”。当增长新的具体策略时,不须要修改上下文类的代码,上下文就能够引用新的具体策略的实例
1. 策略类可能会愈来愈多
2. 全部的策略类都须要暴露给客户端
策略模式和简单工厂模式看起来很是类似,都是经过多态来实现不一样子类的选取,这种思想应该是从程序的总体来看得出的。若是从使用这两种模式的角度来看的话,咱们会发如今简单工厂模式中咱们只须要传递相应的条件就能获得想要的一个对象,而后经过这个对象实现算法的操做。而策略模式,使用时必须首先建立一个想使用的类对象,而后将该对象做为参数传递进去,经过该对象调用不一样的算法。在简单工厂模式中实现了经过条件选取一个类去实例化对象,策略模式则将选取相应对象的工做交给模式的使用者,它自己不去作选取工做。