首先, 策略模式是对算法的一种包装.
其次,策略模式包含3个部分:
* 1.接口/抽象类: 声明算法(策略)
* 2.实现类: 实现上面的接口.提供不同的具体的策略
* 3.环境: Context 里面固定有三个内容:
* 1. 接口声明作为成员变量,表明当前上下文拥有策略
* 2. 通过set方法来决定到底要使用哪一个策略
* 3. 调用策略中的方法.获取结果.
下面, 通过一个实例来对策略模式进行说明:
实例: 使用策略模式加Lambda匿名函数来实现简单的计算器功能:
首先,我们对加,减,乘,除算法进行包装:
public interface Calc {
/**
* 计算行为
* @param num1 数值1
* @param num2 数值2
* @return 结果
*/
double operator(double num1,double num2);
/**
* 4个内部类来实现不同的策略.
*/
class Add implements Calc{
@Override
public double operator(double num1, double num2) {
return num1 + num2;
}
}
class Sub implements Calc{
@Override
public double operator(double num1, double num2) {
return num1 - num2;
}
}
class Mul implements Calc{
@Override
public double operator(double num1, double num2) {
return num1 * num2;
}
}
class Div implements Calc{
@Override
public double operator(double num1, double num2) {
return num1 / num2;
}
}
}
接下来写测试类:
public class Test {
/**
* 声明这里要使用策略
*/
Calc mCalc;
/**
* 定制要采用哪一种策略.
* @param calc
*/
public void setCalc(Calc calc) {
this.mCalc = calc;
}
/**
* 通过策略所封装好的算法来求的结果.
* @return
*/
public double calcResult(){
return mCalc.operator(1,2);
};
public static void main(String [] args){
//-- 静态访问非静态需要通过对象来访问
Test t = new Test();
//-- 设置策略
// 内部类编译后生成的class文件是外部类$内部类.
// 如果是匿名内部类的话class文件是外部类$1.class
t.setCalc(new Calc.Div());
//-- 计算结果
System.out.println(t.calcResult());
}
}