深入浅出设计模式——策略模式

苏凌峰

1.策略模式介绍

2.用代码演示策略模式

3.总结

4.在spring源码中,策略模式的应用

1.策略模式介绍

定义

策略模式,
1)定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法独立于使用算法的客户。
2)这算法体现了几个设计原则,
第一、把变化的代码从不变的代码分离出来;
第二、针对接口编程而不是针对具体类(定义了策略接口)
第三、多用组合/聚合,少用继承。

2)简单地说,
我们再拿积分需求举例(积分需求真的可以套用各种设计模式,所以大家接到这类需求的时候,千万别用if else这种写法来完成整个积分需求,笔者刚出大学的时候,工作第二个月接到的就是积分需求,当时就用了工厂+模板方法+策略模式进行实现。)

假设我们现在在完成任务奖励积分的时候,分了很多种任务类型,分别有不同的奖励算法,这个时候我们就可以使用策略模式。

2.用代码演示策略模式

我们先定义一个算法的抽象类模型:

public interface IIntegralAction {
    //增加/扣除积分前的检查操作,如检查是否开户,检查用户是否异常,检查奖励/使用数是否异常等等
    void preCheck(String userId);
    //执行具体的增减逻辑
    void excute(String userId);
    //执行后置逻辑,如更新数据时间等等操作
    void after(String userId);
}

然后,我们就可以根据奖励积分的算法逻辑不一样,来实现这个接口。

再定义一个抽象类,来实现这个抽象接口,并写好前置和后置的逻辑,设定好调用顺序。

public class Action101 implements IIntegralAction{
    @Override
    public void preCheck(String userId) {
        //检查逻辑
    }

    @Override
    public void excute(String userId) {
        //执行逻辑
    }

    @Override
    public void after(String userId) {
        //后置处理逻辑,比如更新时间
    }
}

然后进行编写就可以了。

3.总结

策略模式就是一种封装一系列算法的方法,每一种算法一个类,所有的这些类完成的都是同一类型的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

我们可能觉得它和之前介绍的模板方法设计模式有点相似,其实它们的区别在于:
模板方法设计模式中,定义算法步骤的主题在抽象的父类中
策略模式中,调用模板方法的主题则在客户端
而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中一般会看到模版方法模式的影子。

4.在spring源码中,策略模式的应用

我们知道在spring中,我们要使用容器管理对象,一般都要先定义信息,可能有xml的,可能有注解的,可能有json的:

image.png

这个时候spring先回把配置文件读取到容器里面去,但是不同的文件读取方式不同,这个时候就使用了策略模式。定义一个抽象的读取方法,然后采用不同的实现。

image.png

阅读 113

你的迷惑在于想得太多而书读的太少。

4 声望
5 粉丝
0 条评论
你知道吗?

你的迷惑在于想得太多而书读的太少。

4 声望
5 粉丝
宣传栏