哈喽,大家好,我是指北君。最近工作上有一个保存企业微信聊天记录的需求,遇到一些问题,数据量太大了,该怎么存?存储之后要检索,怎么才能检索的快呢?聊天产生的文件太多了,怎么去重?需求一句话,可是苦了开发人员了。
以后有时间指北君会整理一下做这个功能的问题和解决方法,今天就拿其中一个问题来分析,使用策略模式来解决问题,没有了解过策略模式或者长时间不用已经忘了策略模式的小伙伴先来简单了解一下策略模式吧。
什么是策略模式
官话:策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。
简单理解就是,针对不同的场景,使用不同的策略进行处理;
优点
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点
- 策略类会增多。
- 所有策略类都需要对外暴露。
使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
结构图
策略模式的简单示例
场景:最近太热了,想要降降温,有什么办法呢
首先,定义一个降温策略的接口
1 |
|
定义3种降温策略;实现策略接口
1 |
|
1 |
|
1 |
|
定义一个降温策略的上下文
1 |
|
测试
1 |
|
运行结果:
1 |
|
以上就是一个策略模式的简单实现
策略模式的项目实战
场景
以我自己在工作中遇到的场景为例,《企业微信会话存档》功能,获取各种格式的消息内容,进行解析并保存数据。这里只针对消息处理的功能模块,其他关于《企业微信会话存档》的功能,有时间整理一下再发出来。
企业微信会话聊天会产生如下多种消息,在SpringBoot项目中应该如何使用策略模式来完成消息的解析呢?
获取会话内容 - API 看API内容,数据都是json格式。思考应该如何处理:
-
首先,既然要解析各种数据,而每种数据格式结构都不一样,那么就需要先根据每种消息格式定义各自的对象,然后根据不同的需求,将json格式处理成pojo对象;
- 根据场景,需要定义两个策略接口,一个是针对普通的文本格式消息的策略,另一个则是需要处理文件格式消息的策略;
- 定义策略处理上下文操作类,用于使用策略
- 每种消息,都会有一些相同的数据,比如发送人、接收人、消息类型等;根据消息类型的不同,使用 key-value 的方式,让调用者确定应该使用哪个策略来处理数据
因为格式太多,这里只使用两个格式作为例子
实现
两个策略接口
1 |
|
1 |
|
策略的具体实现(伪代码)
1 |
|
1 |
|
策略上下文
1 |
|
使用方式(伪代码)
1 |
|
以上就是策略模式的一种实现方式;
使用策略模式来处理不同格式的消息,虽然多了很多策略类,但是让整个功能模块的代码变得清晰,松耦合,而且很容易扩展和修改,并不会影响其他流程。
小结
从以上的例子很明显的可以看出,策略模式的灵活性;如果此时企业微信提供了一种新的消息格式,那么根本无需修改之前的代码,只需要再写一个新的类,实现消息处理策略的接口,重写处理方法即可;
了解策略模式的优点和缺点,合理的使用策略模式,会让你的代码更加的整洁优雅。
写在最后
如果小伙伴们有什么疑问,可以留言哦,或者想和指北君学习交流,欢迎加入Java技术指北读者交流群,聊天学习摸鱼为主,不定时会分享一些技术要点和优质学习资源,有一群有趣有料的小伙伴在等你哦!进群方式:公众号后台回复 888 ,按提示操作即可进群。