简介
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
角色
- 环境(Context):持有一个Strategy的引用。
- 抽象策略(Strategy):一个抽象角色(一个接口或抽象类),定义所有支持的算法的公共接口。
- 具体策略(ConcreteStrategy):实现了接口,包装了具体的算法或行为。
类图
示例
环境
public class Context { protected Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void action() { strategy.action(); } }
抽象策略
public interface Strategy { void action(); }
具体策略
public class ConcreteStrategy1 implements Strategy { public void action() { System.out.println("行为1"); } }
public class ConcreteStrategy2 implements Strategy { public void action() { System.out.println("行为2"); } }
测试&结果
public class Client { public static void main(String[] args) { Strategy strategy = new ConcreteStrategy1(); Context context = new Context(strategy); context.action();//行为1 } }
优缺点
优点
- 动态的改变对象的行为,避免代码重复。
- 避免使用多重条件(if-else)语句,多重条件语句不易维护。
缺点
- 客户端必须知道所有的策略类(也不需要所有,满足自己的需求吧),并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
- 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很多。
Head First 设计模式(中文版)的示例:
码云地址:https://gitee.com/manusas/StrategyDP