标准 专业
多元 极客

设计模式实验室(23)——策略模式

什么是策略模式?

策略模式是一种对象行为模式。

策略模式是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。它定义了一系列的算法,并将每一个算法封装起来,并让他们可以互相替换。它让算法独立于使用它的客户而变化,也可以称其为政策模式(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();
	}
}

模式总结

优点

  • 策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为。
  • 策略模式提供了管理相关的算法族的办法。
  • 策略模式提供了可以替换继承的关系和办法。
  • 使用策略模式可以避免使用多重条件转换语句。

缺点

  • 使用者必须知道所有的策略类,并且决定使用哪一种策略类。
  • 策略模式将会产生很多的策略类,任何细小的变化都可能会增加一个新的具体策略类。
  • 无法同时使用多个策略类来完成一个完成的策略过程。

适用场景

  • 一个对象在多种行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择一种。
赞(0) 投币

评论 抢沙发

慕勋的实验室慕勋的研究院

码字不容易,路过请投币

支付宝扫一扫

微信扫一扫