软件体系结构-策略模式

定义

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。

UML类图

三个部分:

  • 环境类Context
  • 抽象策略类Strategy
  • 具体策略类ConcreteStrategy

代码

抽象策略类

1
2
3
public abstract class Strategy{
public abstract void algorithm();
}

具体策略类

1
2
3
4
5
public class ConcreteStrategyA extends Stractegy{
public void algorithm(){
具体实现
}
}

环境类

1
2
3
4
5
6
7
8
9
10
11
public class Context{
private Strategy strategy;

public void setStrategy(Strategy strategy){
this.strategy = strategy;
}

public void algorithm(){
strategy.algorithm();
}
}

客户端

1
2
3
4
Context context = new Context();
Strategy strategy = (Strategy)XMLUtil.getBean();
context.setStrategy(strategy);
context.algorithm();

优点

  • 提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为
  • 提供了管理相关的算法族的办法
  • 提供了一种可以替换继承关系的办法
  • 可以避免多重条件选择语句
  • 提供了一种算法的复用机制,不同的环境类可以方便地复用策略类

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 将造成系统产生很多具体策略类
  • 无法同时在客户端使用多个策略类

适用

  • 一个系统需要动态地在几种算法中选择一种
  • 避免使用难以维护的多重条件选择语句
  • 不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性