Java设计模式之Strategy(策略模式)
策略模式的定义:
它定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
这里以四则运算举例:输入两个数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.造成很多的策略类。