生活中,要去某地有多种出行方式,步行、骑车、坐车等,每一种方式就是一个策略。在软件开发中,实现一个功能有多种算法,策略模式就是用来选择使用哪种算法的
策略模式(Strategy Pattern):定义一系列算法类,将它们分别封装起来,且它们之间可以相互替换。算法的变化不会影响客户。策略模式又称为政策模式(Policy Pattern),是一种对象行为型模式
完成策略模式需要至少3个角色
抽象策略类(Strategy):可以是抽象类、具体类或接口。声明所支持的算法的抽象方法
具体策略类(ConcreteStrategy):实现抽象策略类中声明的算法
环境类(Context):使用算法的角色,维持一个抽象策略类的引用实例
下面代码演示策略模式
定义抽象策略类
package com.design.behavioral.strategy;
/**
* 抽象策略类
*/
public interface AbstractStrategy {
void algorithm();
}
定义具体策略类
package com.design.behavioral.strategy;
/**
* 具体策略类
*/
public class ConcreteStrategyA implements AbstractStrategy{
@Override
public void algorithm() {
System.out.println("具体算法A");
}
}
定义具体策略类
package com.design.behavioral.strategy;
/**
* 具体策略类
*/
public class ConcreteStrategyB implements AbstractStrategy{
@Override
public void algorithm() {
System.out.println("具体算法B");
}
}
定义环境类
package com.design.behavioral.strategy;
public class Context {
private AbstractStrategy abstractStrategy;
public Context(AbstractStrategy abstractStrategy) {
this.abstractStrategy = abstractStrategy;
}
public void executeStrategy(){
abstractStrategy.algorithm();
}
}
类图如下
测试调用
package com.design.behavioral.strategy;
/**
* 策略模式
*/
public class TestMain {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyB());
context.executeStrategy();
}
}
调用结果如下图
策略模式总结
优点:避免使用多重条件转移语句;符合开闭原则;提高安全性和保密性;避免代码重复
缺点:客户端必须知道所有策略类,并自行决定使用哪一策略类;造成系统产生很多具体策略类;客户端无法使用多个策略类
适用场景:一个系统需要动态地在几种算法中选择一种;对象有很多行为,使用策略模式易于维护;封装算法与相关数据结构提高安全性