概述:在策略模式中,定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
白话解释:策略模式是对算法的封装,把一系列的算法封装到对应的类中
类型:行为类模式
优劣:
- 优点:算法可以自由切换;避免使用if else等多重判断;扩展性高;
- 缺点:策略类随着算法的增加会增多;所有策略类都需要对外暴露
类图:
示例:
定义抽象类
package test.strategy;
/**
* 策略接口
* @author sunlh
*
*/
public interface Strategy {
int doOperation(int num1, int num2);
}
定义具体策略(算法)
package test.strategy;
/**
* 相加
* @author sunlh
*
*/
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
package test.strategy;
/**
* 相减
* @author sunlh
*
*/
public class OperationSubStract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
package test.strategy;
/**
* 相乘
* @author sunlh
*
*/
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
定义封装类
package test.strategy;
/**
* 封装类
* 调用对应的策略对象方法
* @author sunlh
*
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
/**
* 调用算法
* @param num1
* @param num2
* @return 算法结果
*/
public int executeStrategy(int num1, int num2) {
return this.strategy.doOperation(num1, num2);
}
}
测试类
package test.strategy;
public class Test {
public static void main(String[] args) {
int num1 = 10,num2 = 8;
// 相加
Context context1 = new Context(new OperationAdd());
int result1 = context1.executeStrategy(num1, num2);
System.out.println(num1 + " + " + num2 + " = " + result1);
// 相减
Context context2 = new Context(new OperationSubStract());
int result2 = context2.executeStrategy(num1, num2);
System.out.println(num1 + " - " + num2 + " = " + result2);
// 相乘
Context context3 = new Context(new OperationMultiply());
int result3 = context3.executeStrategy(num1, num2);
System.out.println(num1 + " * " + num2 + " = " + result3);
}
}
测试结果:
10 + 8 = 18
10 - 8 = 2
10 * 8 = 80