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

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

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

48 声望
20 粉丝
0 条评论
推荐阅读
SpringBoot请求参数解析原理
通过上篇博客的学习,我们已经知道了SpringBoot是如何通过请求路径找到对应的执行handler的,那么这篇博客,我们将学习springBoot是如何将请求参数和handler的参数一一对应并执行目标方法的过程。

苏凌峰阅读 365

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go9阅读 1.6k评论 2

封面图
与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide4阅读 524

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.1k评论 2

封面图
Redis 发布订阅模式:原理拆解并实现一个消息队列
“65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?““那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆宣传,暴击单身狗。”像这种 65 哥通过朋...

码哥字节6阅读 1.4k

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬6阅读 794

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

48 声望
20 粉丝
宣传栏