Java设计模式之Strategy(策略模式)

14年前

策略模式的定义:

  它定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

这里以四则运算举例:输入两个数a和b我们可能会进行加减乘除等操作,具体采用哪种操作,由用户自己决定,代码如下:

1.将计算结果抽象出一个计算类,这个类只声明了一个计算的方法,具体执行什么样的计算,由具体的子类去实现:

public abstract class Calc {

 public abstract void operate(float a, float b);
}

 

2.创建具体的计算类

/**
 * 加法计算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Add extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "+" + b + "=" + (a + b));
 }

}

 

/**
 * 减法计算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Subtraction extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "-" + b + "=" + (a - b));
 }

}

 

/**
 * 乘法计算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Mult extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "*" + b + "=" + (a * b));
 }

}

 

/**
 * 除法计算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Div extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "/" + b + "=" + (a / b));
 }

}

 

3.创建一个算法类,由这个类决定执行特定的算法(有点像代理)

/**
 * 算法
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Algorithm extends Calc {
 
 private Calc calc; 
 
 public Algorithm(Calc calc){
  this.calc = calc;
 }

 public void operate(float a, float b) {
  calc.operate(a, b);
 }
}

 

/**
 * 测试
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Client {

 /**
  * @param args
  * @since Jul 12, 2010
  * @author YangXin
  * @version 1.00 Jul 12, 2010
  */
 public static void main(String[] args) {
  Calc calc = new Algorithm(new Add());  //执行加法运算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Subtraction()); //执行减法运算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Div());   //执行除法运算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Mult());   //执行简洁运算
  calc.operate(10f, 5f);
  //可见,如想用不同的计算方法,只需创建不同的计算对象即可,不需要改变其它任何地方,实现了类似组件式的编程
 }

}

 

优点:
 1.提供了管理相关的算法族的办法。
 2.提供了可以替换继承关系的办法。
 3.避免使用多重条件转移语句
缺点:
 1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
 2.造成很多的策略类。