原文:链接
1 策略模式是如何业务逻辑代码结构的?
首先,对于策略模式,其定义为一个类的行为或其算法可以在运行是更改
。通俗来讲,就是运使程序时,给一个类的方法传不同的"key",此方法会执行不同的业务逻辑。由此我们最先想到的就是条件分支结构
。那么既然条件分支结构就能够轻松实现,为什么会有策略模式的出现呢?策略模式又优化了什么呢?
策略模式的核心思想与条件分支结构如出一辙,根据不同的key找到不同的业务逻辑。但是实际上不仅仅如此,策略模式就是在代码结构上调整,用接口+实现类+分派逻辑
来提高代码结构的可维护性
。
总之,即使使用了策略模式,需要写的业务逻辑一样要写,到逻辑分派的时候,还是变相的条件分支结构。但是它的优点是抽象出了接口,将业务逻辑封装成了一个个的实现类,任意的替换。在复杂场景(即业务逻辑较多)时比直接使用条件分支结构更易维护
。
2 杀鸡焉用牛刀?条件分支结构场景需要用到策略模式?
有些开发场景中,我们的业务逻辑就那么几行,使用策略模式却需要一大堆类的定义,检查具体的业务逻辑还要去不同的类中,让人觉得很烦。所以策略模式就有以下缺点:
(1)策略类会增多;
(2)业务逻辑分散到各个实现类中,而且没有一个地方可以俯视整个业务逻辑。
因此,有人提出了以下方法来解决传统策略模式的缺点。
范例:优化传统策略模式
(1)为了简单演示这个思路,代码用String类型来模拟一个业务BO
|————getCheckResult()为传统做法;
|————getCheckResultSuper()则事先在Map中定义好了“判断条件”与“业务逻辑”的映射关系,详见代码注释。
/**
某个业务服务类
*/
public class BizService{
/**
传统的if else解决方法
当每个业务逻辑有3、4行时,用传统的策略模式不值得,直接的if else又显得不易读
*/
public String getCheckResult(String order){
if("proof1".equals(order)){
return "run service logic 1";
} else if("proof2".equals(order)){
return "run service logic 2";
}else if("proof3".equals(order)){
return "run service logic 2";
}else if("proof4".equals(order)){
return "run service logic 2";
}else if("proof5".equals(order)){
return "run service logic 2";
}else if("proof6".equals(order)){
return "run service logic 2";
}else if("proof7".equals(