屡试不爽!使用策略模式代替多个if条件语句

屡试不爽!使用策略模式代替多个if条件语句

一、背景:

1.1、多个if else语句,并且每个条件都有复杂的逻辑,代码变的异常臃肿。

1.2、维护成本很大,修改一个存在多年的类,要理清楚找到具体的if条件进行修改,代码行数很多时,需要不断的使用滚动条跳转到具体的行号。

1.3、如果客户要求新增一个算法,还需要再写一个if else,违反了设计模式六大原则中的“开闭原则”。

二、定义:

2.1、策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。

2.2、重点不是如何实现算法,而是如何组织和调用这些算法,从而让我们的程序结构更加的灵活、可扩展。

三、使用场景:

3.1、策略模式一般使用在不同策略比较复杂或者要执行不同操作等,每个if需要执行大段代码的情况。

四、优点:

4.1、把一个复杂的代码块,拆分成若干个逻辑清晰的小代码块。

4.2、策略模式通过抽象、封装来定义一系列的算法,使得这些算法可以相互替换,为这些算法定义一个公共的接口,以约束这些算法的功能具体实现。如果这些算法具有公共的功能,可以将接口变为抽象类,将公共功能放到抽象父类里面。

4.3、策略模式扩展性更好,扩展策略实现非常容易,只需新增一个策略实现类,然后在使用策略实现的地方,使用这个新的策略实现就好。新增或修改时,只新增或修改具体的某个策略类,其他策略类不用修改,减少代码审核人员审核工作量。

4.4、面向接口或抽象编程,能够享受到面向接口编程带来的好处,通过统一的的策略接口来封装和分离各个具体的策略实现,无需关心具体的策略实现。

五、缺点:

5.1、客户端必须了解所有的策略,清楚它们的不同:如果由客户端来决定使用何种算法,那客户端必须知道所有的策略,清楚各个策略的功能和不同,这样才能做出正确的选择,但是这暴露了策略的具体实现。

5.2、增加了对象的数量:由于策略模式将每个具体的算法都单独封装为一个策略类,如果可选的策略有很多的话,那对象的数量也会很多。

5.3、只适合偏平的算法结构:由于策略模式的各个策略实现是平等的关系(可相互替换),实际上就构成了一个扁平的算法结构。即一个策略接口下面有多个平等的策略实现(多个策略实现是兄弟关系),并且运行时只能有一个算法被使用。这就限制了算法的使用层级,且不能被嵌套。

参考资料:

深入解析策略模式: http://www.cnblogs.com/lewis0077/p/5133812.html

设计模式学习之策略模式: https://blog.csdn.net/u012124438/article/details/70039943/

# Java  java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×