策略模式的实践

2023-11-15 17:13:09 浏览数 (1)

前言

在我们实际的开发过程中,实现功能当然是首要目标,但在实现功能的基础上,也要考虑到代码的健壮性和扩展性。健壮性保证了代码运行的质量,扩展性则保证了后续维护的便捷,降低了功能的维护成本。通常实现扩展性的手段就是利用设计模式,将变动的代码抽出,使其能够独立变化而不影响其他部分的代码。其中,策略模式是一种常用的设计模式,本次笔者就带大家了解一下,并结合一个案例,向大家说明如何具体的使用

策略模式

设计模式最初是由GOF(四人帮,全拼 Gang of Four)率先提出的一种思想,主要分为创建型模式,行为型模式,结构型模式三大类。策略模式属于其中的行为型模式,行为型模式的特点主要关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。

在策略模式中,主要存在三种角色

  • 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
  • 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

上面这张图就表示了这种关系,策略类在定义了具体的规则及对应的类

客户端通过引用在策略类中找到对应的实现类,由实现类完成对应的动作。大家可以将引用理解为去医院看病的病人,策略类是导诊台,实现类则是具体的科室,病人去医院通过导诊台了解到自己应该去哪个科室,然后在对应的科室里看病

Excel处理中心

在上文中大家已经了解了策略模式大概的思想,在本章中我们举一个具体的例子来为大家演示,在各类系统中,一定绕不开Excel的导入导出,比较数据维护的终点就是导数据(haha),各种Excel处理的场景有很大的共同点,在导入时,都是将excel中的数据转换为对象,对这些对象进行一些处理,或是校验,或是填充,或是转换,然后存入db,失败的记录单独记录。导出的场景则是根据一些参数查询DB中的数据,然后组合,拼装,生成文件,提供给用户。其实在一个系统中完全可以利用策略模式,减少重复的代码及接口,提供一套统一的接口给前端,每次新增一种场景,后端只需关注核心的业务逻辑就可以了。

代码语言:java复制
interface ExcelCommonService{
  enum getType();
  
  void importExecl();
  
  void exportExcel();

  void exportTemplate();
  
}

在这个类中定义了几个方法,getType()是用来区分各个不同的场景的,importExecl()是用来实现导入逻辑的,exportTemplate()是用来实现导出模版的,exportExcel()是用来实现导出excel的

各个业务场景只需要在对应的实现类下实现自己的逻辑,此外再向前端提供一套通用的接口,通过type进行对应的处理,这样便能降低很多工作量,当然,这里举得只是一个简单的例子,还可以在此上进行扩充,比如新增一张表,每次有导入或导出都记入表中,这样便能记录每次导入导出的相关信息,将每次的操作持久化记录下来,还可以利用定时任务,针对不同的情况分批处理,异步调用、延迟调用,降低系统在峰值时的压力。

结尾

虽然策略模式有很多好处,但在使用时也需要结合具体的业务场景进行考虑,不然在定义完对应的策略类后,效果不加,反而会成为开发的负担。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞