首页 > 技术文章 > 策略模式Strategy

manusas 2017-12-15 14:51 原文

简介

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

角色

  • 环境(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

推荐阅读