1、策略模式结构图:
2.模式分析:
模式涉及到三个角色:
-
环境(Context) 角色: 持有一个Strategy类的引用(上下文对象),负责和具体的策略类交互。
-
抽象策略(Strategy)角色: 这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策咯类所需的接口。
-
具体策略(ConcreteStrategy) 角色: 封装了具体的算法或行为。
3.代码:
//Strategy类,定义所以支持的算法的公共接口
//抽象算法类
abstract class Strategy {
//算法方法
public abstract void AlgorithmInterface();
}
//ConcreteStrategy,封装了具体的算法或行为,继承于//Strategy
public class ConcreteStrategyA extends Strategy{
@Override
public void AlgorithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法A实现");
}
}
public class ConcreteStrategyB extends Strategy{
@Override
public void AlgorithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法B实现");
}
}
public class ConcreteStrategyC extends Strategy{
@Override
public void AlgorithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法C实现");
}
}
//Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
public class Context {
Strategy strategy;
public Context(Strategy strategy) {//初始化时,传入具体的策略对象
this.strategy = strategy;
}
public void ContextInterface() {//根据具体的策略对象,调用其算法的方法
strategy.AlgorithmInterface();
}
}
//客户端:
package 策略模式;
public class Main {
public static void main(String[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
}
}
4、策略模式的优点:
-
策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
-
策略模式提供了管理相关的算法族的办法。
-
策略模式提供了可以替换继承关系的办法。 使用策略模式可以避免使用多重条件转移语句。
5、策略模式的缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。