策略模式
概述
策略模式(Strategy)是一种行为型模式,
好处是我们可以动态的改变对象的行为.针对一组算法或者策略,我们可以将其抽象出来,提供一个统一的接口,不同的算法或者策略有不同的实现类,
通过注入不同的对象实现策略的动态替换,提高扩展性和维护性.
定义
策略模式定义了一系列算法,并将每一个算法封装起来,使得他们可以相互替换,策略模式让算法独立于使用它的客户端,在不影响到客户端的情况下发生变化.
UML
策略模式相当于算法的封装,将算法本身和其实现功能分离开来.
- Context : 操作策略的上下文环境,持有
Strategy
引用 - Strategy: 抽象策略角色,通常是一个接口或抽象类,提供具体策略所需接口.
- ConcreteStrategy : 具体策略角色,包装了一系列算法或行为.
使用场景
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差异时.
- 需要安全的封装多种同一类型的操作时.
- 出现同一抽象类有多个子类,而又需要根据不同情况来选择具体的子类时.
例子
例子描述:人上班,使用步行或者开车上班;
策略:步行上班、开车上班...
- 抽象策略接口
package com.dyleaf.behavior.StrategyPattern;
public interface IStrategy {
public void execute();
}
- 具体策略
package com.dyleaf.behavior.StrategyPattern;
public class DriveStrategy implements IStrategy {
@Override
public void execute() {
System.out.println("driving。。。");
}
}
package com.dyleaf.behavior.StrategyPattern;
public class WalkStrategy implements IStrategy {
@Override
public void execute() {
System.out.println("Walking。。。");
}
}
- 环境
package com.dyleaf.behavior.StrategyPattern;
public class Context {
IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public void execute() {
this.strategy.execute();
}
}
- 客户端
package com.dyleaf.behavior.StrategyPattern;
public class Test {
public static void main(String[] args) {
Context context = null;
context = new Context(new WalkStrategy());
context.execute();
context = new Context(new DriveStrategy());
context.execute();
}
}
示例二 JDK中的示例,Collections.sort方法
不需为新的对象修改sort()方法,你需要做的仅仅是实现你自己的Comparator接口
Collections.sort(
list, //待排序的集合
new Comparator<>(){ //具体排序策略
@Override
public int compare(A a1, A a2) {
return ; //具体大小判断规则
}
});
策略模式的特点
- 封装具体的策略和算法,而在什么情况下使用什么算法是由客户端决定的.
- 其重心并不是如何实现算法,而是如何组织和调用这些算法.
- 策略模式中各个算法的地位是平等的,相互独立的,因此可以相互替换.
- 策略中虽然有一组算法,但是在某一时刻,只能使用其中一个
补充说明
与状态模式区别:使用策略模式时,客户端手动选择策略,使用状态模式时,其行为是根据状态是自动切换的。