设计模式--策略模式
1、策略模式
策略模式:定义一些列算法,把它们一个个的封装起来,并且使它们可以相互替换,该模式可以使得算法独立于使用它的客户而变化。
2、策略模式的结构
-
角色
-
策略:策略是一个接口,该接口定义了若干算法,也即是若干的抽象方法;
-
上下文:上下文是依赖于策略接口的类,即上下文包含策略声明的变量,上下提供一个方法,该方法委托策略变量调用具体策略所
-
具体策略:具体策略是实现策略接口的类,它需要实现策略接口中定义的抽象方法。
-
-
类图
3、策略模式举例
策略接口:Strategy.java
package com.nick.pattern.strategy; /** * 抽象策略接口:定义若干抽象方法 * @author nick */ public interface Strategy { public abstract void algorithm(); }
上下文:Context.java
package com.nick.pattern.strategy; /** * 上下文类 * @author nick */ public class Context { Strategy strategy; //定义策略变量 public void setStrategy(Strategy strategy){ this.strategy=strategy; //设置策略 } void lookAlgorithm(){ //定义的一个方法 strategy.algorithm(); //在方法中委托策略变量调用策略接口中的抽象方法 } }
具体策略A: StrategyA.java
package com.nick.pattern.strategy; /** * 具体策略类A(实现策略接口) * @author nick */ public class StrategyA implements Strategy{ @Override public void algorithm() { System.out.println("调用算法A"); } }
具体策略B: StrategyB.java
package com.nick.pattern.strategy; /** * 具体策略类B * @author nick */ public class StrategyB implements Strategy { @Override public void algorithm() { System.out.println("调用算法B"); } }
主程序
package com.nick.pattern.strategy; /** * 主程序 * @author nick */ public class Application { public static void main(String[] args) { Context context = new Context(); //定义上下文对象 context.setStrategy(new StrategyA()); //给上下文对象设置策略算法A context.lookAlgorithm(); //在该算法下进行计算 context.setStrategy(new StrategyB()); //给上下文对象设置策略算法B context.lookAlgorithm(); //在算法B下进行计算 } }
运行结果:
4、策略模式的优缺点
-
优点1:上下文和具体策略是松耦合的关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要关心是哪个类在实现。
-
优点2:策略模式满足“开-闭”原则。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。