如何巧妙使用策略模式提高代码的健壮性和扩展性

后端 潘老师 6个月前 (11-12) 121 ℃ (0) 扫码查看

本文主要讲解如何巧妙使用策略模式提高代码的健壮性和扩展性,我们一起来看看吧!

前言

在我们实际的开发过程中,实现功能当然是首要目标,但在实现功能的基础上,也要考虑到代码的健壮性和扩展性。健壮性保证了代码运行的质量,扩展性则保证了后续维护的便捷,降低了功能的维护成本。

通常实现扩展性的手段就是利用设计模式,将变动的代码抽出,使其能够独立变化而不影响其他部分的代码。其中,策略模式是一种常用的设计模式,本次笔者就带大家了解一下,并结合一个案例,向大家说明如何具体的使用

策略模式

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

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

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

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

Excel处理中心

在上文中大家已经了解了策略模式大概的思想,在本章中我们举一个具体的例子来为大家演示,在各类系统中,一定绕不开Excel的导入导出,比较数据维护的终点就是导数据(haha),各种Excel处理的场景有很大的共同点,在导入时,都是将excel中的数据转换为对象,对这些对象进行一些处理,或是校验,或是填充,或是转换,然后存入db,失败的记录单独记录。

导出的场景则是根据一些参数查询DB中的数据,然后组合,拼装,生成文件,提供给用户。其实在一个系统中完全可以利用策略模式,减少重复的代码及接口,提供一套统一的接口给前端,每次新增一种场景,后端只需关注核心的业务逻辑就可以了。

interface ExcelCommonService{
  enum getType();
  
  void importExecl();
  
  void exportExcel();

  void exportTemplate();
  
}

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

各个业务场景只需要在对应的实现类下实现自己的逻辑,此外再向前端提供一套通用的接口,通过type进行对应的处理,这样便能降低很多工作量。

当然,这里举得只是一个简单的例子,还可以在此上进行扩充,比如新增一张表,每次有导入或导出都记入表中,这样便能记录每次导入导出的相关信息,将每次的操作持久化记录下来,还可以利用定时任务,针对不同的情况分批处理,异步调用、延迟调用,降低系统在峰值时的压力。

结尾

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

以上就是如何巧妙使用策略模式提高代码的健壮性和扩展性的全部内容,如果想要学习其他设计模式,请阅读《Java设计模式教程》。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/11129.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】