简介
定义一组算法,将每个算法都封装起来,并且使他们相互转换。
意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
解决问题: 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护(简而言之消除if分支过多问题)
指导思想:开闭原则、迪米特法则、依赖倒置原则
策略模式结构图如下:
角色
通过上述结构图可以看出策略模式包含的角色:
环境类(Context):用来操作策略的上下文环境,起承上启下作用,屏蔽高层模块对策略,算法的直接访问。是策略模式的重点,它借用了代理模式的思路,和代理模式的区别就是封装角色和被封装的策略类不是同一个接口。
抽象策略类(Strategy):策略的抽象,通常为接口或者是抽象类,定义每个策略或者是算法必须具有的属性和方法。
具体策略类(ConcreteStrategy):具体的策略实现,包含具体的算法。
简单实现
1.定义抽象策略类(Strategy)
public interface Strategy {
void doSomething();
}
2.定义两个具体策略类(ConcreteStrategy)分别实现抽象策略。
public class ConcreteStrategyA implements Strategy {
@Override
public void doSomething() {
System.out.println("A do something....");
}
}
public class ConcreteStrategyB implements Strategy{
@Override
public void doSomething() {
System.out.println("B do something ...");
}
}
3.定义环境上下文。
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void exec(){
this.strategy.doSomething();
}
}
4.Client(Main验证)
public class StrategyMain {
public static void main(String[] args) {
Strategy A = new ConcreteStrategyA();
Context contextA = new Context(A);
contextA.exec();
Strategy B = new ConcreteStrategyB();
Context contextB = new Context(B);
contextB.exec();
}
}