策略模式
2016-08-18 本文已影响21人
忘净空
模式定义
定义一些列的算法,吧他们一个个封装起来,并且使他们克相互替换。本模式使得算法可独立于使用它的客户而变化。
模式结构
模式结构代码实现
interface Strategy {
public void doSomething();
}
class ConcreteStrategy1 implements Strategy {
public void doSomething() {
System.out.println("具体策略1");
}
}
class ConcreteStrategy2 implements Strategy {
public void doSomething() {
System.out.println("具体策略2");
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void execute(){
strategy.doSomething();
}
}
public class Client {
public static void main(String[] args){
Context context;
System.out.println("-----执行策略1-----");
context = new Context(new ConcreteStrategy1());
context.execute();
System.out.println("-----执行策略2-----");
context = new Context(new ConcreteStrategy2());
context.execute();
}
}
模式的优缺点
优点
-
策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
-
策略模式提供了管理相关的算法族的办法。
-
策略模式提供了可以替换继承关系的办法。
-
使用策略模式可以避免使用多重条件转移语句。
缺点
-
必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的。
-
维护各个策略类会给开发带来额外开销,策略模式将造成产生很多策略类。
思考
模式本质:分离算法,选择实现。
开发中的应用场景
-
几个类的主要逻辑相同,只在部分逻辑的算法和行为上稍有区别的情况。
-
有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。