/*
* 策略模式
* 优点
* 算法可以自由切换
* 避免使用多重条件判断
* 扩展性良好
*/
public class MyMain {
public static void main(String[] args) {
// 两个参数
int a = 8, b = 4;
// 加载加法策略
System.out.println("8+4=" + new CalculatorA(new Addition()).Action(a, b));
// 加载减法策略
System.out.println("8-4=" + new CalculatorA(new Subtraction()).Action(a, b));
// 加载乘法策略
System.out.println("8*4=" + new CalculatorA(new Multiplication()).Action(a, b));
// 加载除法策略
System.out.println("8/4=" + new CalculatorA(new Division()).Action(a, b));
// 策略枚举
System.out.print("计算4+3*5+9-2/2=");
System.out.println(Calculator.Addition.Operation(4,
Calculator.Addition.Operation(Calculator.Multiplication.Operation(3, 5),
Calculator.Subtraction.Operation(9, Calculator.Division.Operation(2, 2)))));
}
}
// 普通策略
// 定义一个抽象运算策略
abstract interface IOperationA {
// 抽象的运算法则
abstract public int Action(int a, int b);
}
// 具体的运算环境
class CalculatorA {
// 运算策略
private IOperationA operationA;
public CalculatorA(IOperationA operationA) {
this.operationA = operationA;
}
// 使用运算
public int Action(int a, int b) {
return operationA.Action(a, b);
}
}
// 具体的加法运算策略
class Addition implements IOperationA {
@Override
public int Action(int a, int b) {
return a + b;
}
}
// 具体的减法运算策略
class Subtraction implements IOperationA {
@Override
public int Action(int a, int b) {
return a - b;
}
}
// 具体的乘法运算策略
class Multiplication implements IOperationA {
@Override
public int Action(int a, int b) {
return a * b;
}
}
// 具体的除法运算策略
class Division implements IOperationA {
@Override
public int Action(int a, int b) {
return a / b;
}
}
// 扩展
// 策略枚举
// 定义一个计算的策略枚举
enum Calculator {
// 加法
Addition("+") {
@Override
public int Operation(int a, int b) {
return a + b;
}
},
// 减法
Subtraction("-") {
@Override
public int Operation(int a, int b) {
return a - b;
}
},
// 乘法
Multiplication("*") {
@Override
public int Operation(int a, int b) {
return a * b;
}
},
// 除法
Division("/") {
@Override
public int Operation(int a, int b) {
return a / b;
}
};
String value = "";
private Calculator(String value) {
this.value = value;
}
public String getValue() {
return value;
}
abstract public int Operation(int a, int b);
}