一. 模式定义
- 策略模式指的是对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法。
- 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
- 主要目的就是解耦合,分离算法,选择实现
二.模式结构
环境(Context):有一个Strategy类的引用,和具体的策略类交互。
抽象策略(Strategy)角色:一个接口或抽象类,给出规范。
具体策略(ConcreteStrategy)角色:具体算法或行为。
- 环境(Context)
//上下文环境
static class Context {
private IStrategy mStrategy;
public Context(IStrategy strategy) {
this.mStrategy = strategy;
}
public void algorithm() {
this.mStrategy.algorithm();
}
}
- 抽象策略
//抽象策略类 Strategy
interface IStrategy {
void algorithm();
}
- 具体策略
//具体策略类 ConcreteStrategyA
static class ConcreteStrategyA implements IStrategy {
@Override
public void algorithm() {
System.out.println("Strategy A");
}
}
//具体策略类 ConcreteStrategyB
static class ConcreteStrategyB implements IStrategy {
@Override
public void algorithm() {
System.out.println("Strategy B");
}
- 用户类
class Client {
public static void main(String[] args) {
//选择一个具体策略
IStrategy strategy = new ConcreteStrategyA();
//来一个上下文环境
Context context = new Context(strategy);
//客户端直接让上下文环境执行算法
context.algorithm();
}
三.使用场景
- 一个系统中有许多类,他们之间的区别仅仅是他们的行为,,使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
- 不希望客户端知道复杂的,与算法相关的数据结构,封装算法,提高保密性与安全性。
策略模式中,应当由客户端自己决定在什么情况下使用哪一个具体策略角色。
策略模式并不决定在何时何地使用何种算法,算法的选择由客户端来决定。
策略模式与状态模式区别
-
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态
-
而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。
关于状态模式可看: