策略模式用于分离算法和算法执行的环境,适用于算法变化多样的场景。下面以一个简单的命令行加减计算器的例子说明策略模式。
策略模式首先需要一个策略接口。在计算器例子中,策略接口是操作Operation
,用来抽象加、减等操作。
public interface Operation {
public int operate(int num1, int num2);
}
加操作、减操作是具体的操作类。
加操作
public class AddOperation implements Operation {
@Override
public int operate(int num1, int num2) {
return num1 + num2;
}
}
减操作
public class SubtractOperation implements Operation {
@Override
public int operate(int num1, int num2) {
return num1 - num2;
}
}
环境类Context
封装整个计算器的行为,持有一个Operation
接口的引用,并在构造方法中传入具体的Operation
对象。
public class Context {
private Operation oper;
private int num1, num2;
public Context(Operation oper) {
this.oper = oper;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int operate() {
return oper.operate(num1, num2);
}
}
在驱动类Main
中,通过给计算器类Context
传入不同的操作类,实现加/减法计算器。当操作增多时,还可以结合工厂模式,创建操作工厂类管理操作类(策略)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Context context = new Context(new AddOperation());
System.out.println("--------- Add ---------");
context.setNum1(scan.nextInt());
context.setNum2(scan.nextInt());
System.out.println("Result: " + context.operate());
// --------- Add ---------
// 1
// 2
// Result: 3
context = new Context(new SubtractOperation());
System.out.println("--------- Subtract ---------");
context.setNum1(scan.nextInt());
context.setNum2(scan.nextInt());
System.out.println("Result: " + context.operate());
// --------- Subtract ---------
// 1
// 2
// Result: -1
scan.close();
}
}