首先, 策略模式是对算法的一种包装.
其次,策略模式包含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()); } }