策略模式(Strategy):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
适用场景:
1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法;
2、需要使用一个算法的不同变体;
3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构;
4、一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy 类中以代替这些条件语句。
通用类图:
实际上,策略模式是采用了面向对象的继承和多态机制,客户根据自己的业务需要调用上下文(Context 类)获得相应的具体策略、算法实现。
假设我们要实现一个非常简单的计算机,只能进行加减操作。一般我们会这样设计:根据传入的 String 型参数使用 if… else… 语句判断用户需要哪种操作。
代码如下:
- class Calculator {
-
private final static String ADD = "+";
-
private final static String SUB = "-";
-
-
public int calculate(int a, int b, String operator) {
-
int result = 0;
-
if(this.ADD.equals(operator)) {
- result = a + b;
-
}else {
- result = a - b;
- }
-
return result;
- }
- }
-
-
-
public class Client {
-
public static void main(String[] args) {
-
Calculator calculator = new Calculator();
-
System.out.println(calculator.calculate(10, 13, "+"));
-
System.out.println(calculator.calculate(10, 13, "-"));
- }
- }
这样的设计比较死板,如果我们要实现乘除法呢?就不得不修改 Calculator 类中的 operation()方法,改变 if… else…语句的结构。 为了适应变化,使用策略模式来重新设计。
代码如下:
-
-
interface Operation {
-
public int calculate(int a, int b);
- }
-
-
class Add implements Operation {
-
public int calculate(int a, int b) {
-
return (a + b);
- }
- }
-
-
class Sub implements Operation {
-
public int calculate(int a, int b) {
-
return (a - b);
- }
- }
-
-
-
class Calculator {
-
private Operation operation;
-
-
-
public void setOperation (Operation operation) {
-
this.operation = operation;
- }
-
-
public int calculate(int a, int b) {
-
return this.operation.calculate(a, b);
- }
- }
-
-
-
public class Client {
-
public static void main(String[] args) {
-
-
Calculator calculator = new Calculator();
-
-
-
calculator.setOperation(new Add());
-
System.out.println(calculator.calculate(20, 13));
-
-
-
calculator.setOperation(new Sub());
-
System.out.println(calculator.calculate(20, 13));
- }
- }
下面使用枚举策略的方式来实现,代码如下:
-
-
enum Calculator {
-
-
- Add(){
-
public int calculate(int a, int b) {
-
return (a + b);
- }
-
},
-
-
- Sub(){
-
public int calculate(int a, int b) {
-
return (a - b);
- }
-
};
-
-
-
public abstract int calculate(int a, int b);
- }
-
-
public class Client {
-
public static void main(String[] args) {
-
-
System.out.println(Calculator.Add.calculate(20, 13));
-
-
-
System.out.println(Calculator.Sub.calculate(20, 13));
- }
- }
策略模式是比较简单的一个模式了,但是它也有不足之处:所有的具体策略都必须暴露给客户,否则客户怎样根据自身需要使用不同的策略呢?而且,策略模式实际上是把条件判断的逻辑(即各个条件分支,也就是每个具体策略)转移到客户端了,由客户来选择不同的具体策略。
本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/343464,如需转载请自行联系原作者