#1.定义
Define a family of algorithms,encapsulate each one,and make them interchangeable.
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
#2.代码
策略接口:
//策略接口
public interface Strategy {
//各个策略的执行逻辑
public void doSomething();
}
两个具体的策略:
public class ConcreteStrategy1 implements Strategy {
@Override
public void doSomething() {
System.out.println("策略1的具体逻辑");
}
}
public class ConcreteStragety2 implements Strategy {
@Override
public void doSomething() {
System.out.println("策略2的具体逻辑");
}
}
封装类:
public class Context {
private Strategy strategy;
//构造函数里传入策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void doAnything() {
//调用传入策略的方法
this.strategy.doSomething();
}
}
测试类:
public static void main(String[] args) {
//创建策略
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
//需要策略1,就传入策略1
Context context = new Context(strategy1);
context.doAnything();
//需要策略2,就传入策略2
context = new Context(strategy2);
context.doAnything();
}
结果:
策略1的具体逻辑
策略2的具体逻辑
#3.策略模式的优缺点
优点:良好的扩展性,新的策略只要实现接口即可。切换策略简单,不需要太多重复的if语句判断。
缺点:调用的时候必须知道有哪些策略,才能传进去哪些策略,如此,封装类就毫无意义了。可和其他模式相互使用来弥补。
#4.注意点
#5.策略模式的扩展-策略枚举
public enum Calculator {
//枚举成员
ADD("+") {
@Override
public int exec(int a, int b) {
return a + b;
}
},
SUB("-") {
@Override
public int exec(int a, int b) {
return a - b;
}
};
private String value;
//成员值类型
Calculator(String value) {
this.value = value;
}
public String getValue() {
return value;
}
//抽象方法,相当于策略模式的抽象接口,直接枚举成员方法实现该抽象函数
public abstract int exec(int a, int b);
}
测试类:
public static void main(String[] args) {
System.out.println(Calculator.ADD.getValue());
System.out.println(Calculator.ADD.exec(1, 2));
}
结果:
+
3