策略模式定义了算法族,分别封装起来,让它们之间能够互相替换,此模式让算法的变化独立于使用算法的客户。(其实相似于if-else模式)java
将一个类中常常改变或者未来可能改变的部分提取出来,做为一个接口而后在类中包含这个对象的实例,这样类的实例在运行时就能够随意调用实现了这个接口的类的行为。原理是用多态实现的。算法
系统有不少类,它们的区别仅在于行为不一样,一个系统须要动态地在几种算法中选择一种。框架
策略模式中包含三部分:
策略(Strategy):策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法。
具体策略(ConcreteStrategy):具体策略是实现策略接口的类,具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。ide
优势:符合开闭原则,增长程序的可扩展性和可维护性;避免多个if-else判断
缺点:客户端必须知道全部策略类,并自行决定使用哪个策略类this
Strategy接口定义了一个算法族,均实现了behavior()方法。
Context是使用到该算法族的类,它的dosomething()方法会调用behavior(),setStrategy(Strategy)方法能够动态地改变strategy对象,即动态改变Context使用的算法。
设计
通常状况下,策略模式会结合工厂模式或单例模式一块儿使用code
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
Spring框架中的Resourse以及初始化接口InstantiationStrategy对象
//定义一个策略接口 public interface tmpStrategy{ void quack(); }
//定义具体策略方法 //普通鸭子呱呱叫算法 public class IsQuack implements tmpStrategy{ @Override public void quack(){ System.out.println("普通鸭子呱呱叫"); } } //橡皮鸭子吱吱叫算法 public class Squeak implements tmpStrategy{ @Override public void quack(){ System.out.println("橡皮鸭子吱吱叫"); } } //木头鸭子不会叫算法 public class MuteQuack implements tmpStrategy{ @Override public void quack(){ System.out.println("木头鸭子不会叫"); } }
//客户端调用算法 public class Context { //注入策略接口之后,才能够选择策略。 private tmpStrategy strategy; public Context(tmpStrategy strategy){ this.strategy = strategy; } public void setQuackBehavior(){ strategy.quack(); } public static void main(String[] args) { System.out.println("guagua"); Context context1 = new Context(new IsQuack()); context1.setQuackBehavior(); System.out.println("zhizhi"); Context context2 = new Context(new Squeak()); context2.setQuackBehavior(); System.out.println("nono"); Context context3 = new Context(new MuteQuack()); context3.setQuackBehavior(); } }