今天给大家讲解一下设计模式中的策略模式,下面的图片是真实项目中的前端图片,目前接入了三个算法能力,根据产品经理要求,后期还会有不同的算法加入进来,这个时候我们需要考虑一个好的结构对代码进行优化,可能有一些小伙伴会说直接使用
if...elif..else
分支语句不就可以了,但是从系统的健壮性和可维护性方面我们在这里不能大量的使用if分支结构,因为每一种算法能力的代码量极其大而且算法参数有的多达十几个,加之后期会有其他算法加入,很容易顾此失彼,牵一发而动全身。接下来我们来讲解一下策略模式的使用。
我们以高德地图来讲解,当我们搜索一个位置的时候,高德地图会给我们展示出不同的出行方式,我们这里只是对模型进行了简单的抽象,当然高德地图肯定用到了其他较为复杂的代码模式。就本页面而言,你会选择使用混乱的if多分支语句吗,显然是不合理的,当我们每选择一个路线的时候,后台就会if分支判断一遍,最差的情况是从头判断到尾。
在讲解了多分支语句可能带来的风险和弊端后,我们引入策略模式。看下图,我们将不同的算法封装到独立的类中,也就是抽象出来一个接口,新加入的算法类必须实现这个接口的策略方法。
__init__
方法接受具体的算法类,execute_algorithm
方法最终被客户端调用,这样上下文其实不知道具体的算法策略。它会通过同样的通用接口与所有策略进行交互, 而该接口只需暴露一个方法来触发所选策略中封装的算法即可。指向具体策略的引用, 且仅通过策略接口与该对象进行交流。
下面我们来总结一下,使用策略模式的步骤
setter
,创建调用具体算法的方法,上下文仅可通过该方法与具体的策略交互