什么是策略模式?
策略模式是一种对象行为模式。
策略模式是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。它定义了一系列的算法,并将每一个算法封装起来,并让他们可以互相替换。它让算法独立于使用它的客户而变化,也可以称其为政策模式(Policy)。
核心结构
策略模式具有以下角色:
- Context。环境类,它在某个行为中,在不同的场景下拥有不同的算法,并且维护着一个抽象策略类的引用实例。
- Strategy。抽象策略类,它提供了对不同算法实现的抽象方法,是所有的具体策略类的父类,它可以是抽象类或者是具体类,亦或是接口。
- ConcreteStrategy。具体策略类,它实现了抽象策略类的抽象方法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法来实现某个业务处理。
类图展示
代码分析
我们以推送消息类型分为指定推送,地域推送和全量推送为例。
首先我们需要定义一个推送抽象策略类
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
* 策略模式——抽象策略
*/
public interface Push {
/**
* 抽象算法
*/
public void push();
}
接着就需要对各个推送消息的方式进行实现。
指定推送策略实现:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
* 策略模式——具体策略
*/
public class AppointPush implements Push{
@Override
public void push() {
System.out.println("Appoint device push task");
}
}
地域推送策略实现
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
* 策略模式——具体策略
*/
public class DistrictPush implements Push {
@Override
public void push() {
System.out.println("District push task");
}
}
全量推送策略实现:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
* 策略模式——具体策略
*/
public class FullAmountPush implements Push{
@Override
public void push() {
System.out.println("Full amount push task");
}
}
最后我们需要构建一个环境类,用于执行推送策略:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
* 策略模式——环境类
*/
public class PushContext {
/**
* 生产推送对象
*/
private Push push;
public PushContext(Push push){
this.push = push;
}
/**
* 消息推送,环境类无需关注推送类型
*/
public void messagePush() {
push.push();
}
}
我们的测试代码:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/10 0010.
*/
public class StrategyTest {
public static void main(String[] args) {
Push push = new FullAmountPush();
PushContext pushContext = new PushContext(push);
pushContext.messagePush();
push = new AppointPush();
pushContext = new PushContext(push);
pushContext.messagePush();
push = new DistrictPush();
pushContext = new PushContext(push);
pushContext.messagePush();
}
}
模式总结
优点
- 策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承的关系和办法。
- 使用策略模式可以避免使用多重条件转换语句。
缺点
- 使用者必须知道所有的策略类,并且决定使用哪一种策略类。
- 策略模式将会产生很多的策略类,任何细小的变化都可能会增加一个新的具体策略类。
- 无法同时使用多个策略类来完成一个完成的策略过程。
适用场景
- 一个对象在多种行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。