一、策略模式(Strategy):
定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
二、使用场景:
1、一个系统有许多类,而区分它们的只是他们直接的行为。
2、在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
三、实践
3.1 定义策略接口
public interface CalculateStrategy {
int doCalculate(int num1, int num2);
}
3.2 创建实现策略接口的实现类
//模拟计算器的加法
public class ConcreteAdd implements CalculateStrategy {
@Override
public int doCalculate(int num1, int num2) {
return num1 + num2;
}
}
//减法
public class ConcreteMinus implements CalculateStrategy {
@Override
public int doCalculate(int num1, int num2) {
return num1 - num2;
}
}
//乘法
public class ConcreteMultiply implements CalculateStrategy{
@Override
public int doCalculate(int num1, int num2) {
return num1 * num2;
}
}
//除法
public class ConcreteDivision implements CalculateStrategy {
@Override
public int doCalculate(int num1, int num2) {
return num1 / num2;
}
}
3.3 创建一个上下文context,封装策略类
public class CalculateContext {
//策略对象接口
private CalculateStrategy strategy;
public CalculateContext(CalculateStrategy strategy) {
this.strategy = strategy;
}
//执行某种算法
public int execute(int num1, int num2){
return strategy.doCalculate(num1,num2);
}
}
3.4 测试
public class Test {
public static void main(String[] args) {
//构造context时传入的是策略接口CalculateStrategy的实现类ConcreteAdd,所以execute执行的是add方法
//加法
CalculateContext addContext = new CalculateContext(new ConcreteAdd());
System.out.println("1+1="+addContext.execute(1,1));
//减法,构造传入的是策略接口的加法实现类,execute执行加法算法
CalculateContext minusContext = new CalculateContext(new ConcreteMinus());
System.out.println("5-3="+minusContext.execute(5,3));
//执行乘法算法
CalculateContext multiply = new CalculateContext(new ConcreteMultiply());
System.out.println("2*3="+multiply.execute(2,3));
//执行除法算法
CalculateContext divisonContext = new CalculateContext(new ConcreteDivision());
System.out.println("9/3="+divisonContext.execute(9,3));
}
}