一、策略模式的定义
1.在解释策略模式之前,我们先了解什么是设计模式?
设计模式——设计模式是人们在面对同类型软件工程设计问题所总结出的一些有用的经验。模式不是代码,而是某类问题的通用设计解决方案。
2.为什么需要去深入的了解设计模式?
通常一些新码农有可能第一份工作就是依赖一个成熟的内部(或开源)框架的基础上,通过配置文件及少量代码开发完成开发需求。不了解框架就被框架束缚,感到困惑。即使有心学习当前框架,一味翻看框架代码,感觉比较晦涩难懂。我们为了更快的学习java源码及各种框架,为了提高工作的效率,为了更快的成为一名合格的架构师,在有一定的java基础后,接着我们应该尽快深入了解java设计模式。
3.策略模式的定义
策略模式——其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
举例说明一下策略模式:我们就以Java中的TreeSet为例,TreeSet仅仅知道它只是接收一个Comparator这种接口类型,但是具体是哪种实现类,TreeSet并不关心,实现类在真正的传入TreeSet之前,TreeSet本身是不知道的,所以我们可以自己去实现Comparator接口,然后在实现类里面去封装好我们自己的规则(这里的规则你可以当做是算法),比如说我们要实现对一个集合的元素排序,但是到底是要升序排序还是降序排序,这个完全由我们来去控制,我们可以把这种变化的内容封装到自己的实现类中,真正运行的时候才知道具体的实现。
为了更好的说明策略模式,我们抽象出三个角色,如下所示:
抽象策略角色——这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们Comparator接口。
具体策略角色——包装了具体的算法和行为。对比来说,就是实现了Comparator接口的实现一组实现类。
环境角色——内部会持有一个抽象角色的引用,给客户端调用。对比来说,就是我们的TreeSet类。说明:TreeSet内部一定会有一个策略类的一个成员变量,这样做的目的在于可以当我们在去创建TreeSet对象的时候,可以接收我们向TreeSet类中传递的具体的策略类。
二、策略模式的应用场景
1.容错恢复机制
什么是容错恢复机制?
容错恢复机制——简单点说就是:程序运行的时候,正常情况下应该按照某种方式来做,如果按照某种方式来做发生错误的话,系统并不会崩溃,也不会就此不能继续向下运行了,而是有容忍出错的能力,不但能容忍程序运行出现错误,还提供出现错误后的备用方案,也就是恢复机制,来代替正常执行的功能,使程序继续向下运行。
注意:下文策略模式demo示例中有代码展示。
三、策略模式的类图UML
四、策略模式demo示例
编写代码的步骤:
(1)定义抽象策略角色(为策略对象定义一个公共的接口)
(2)编写具体策略角色(实际上就是实现上面定义的公共接口)
(3)定义环境角色,内部持有一个策略类的引用
案例一,实现加减乘除的功能。
(1)定义抽象策略角色,代码如下所示:
/**
* 定义抽象策略接口
* 类似于Comparator接口
* */
public interface Strategy {
/**
* 定义一个两个数进行计算的方法。
* */
public int calc(int num1 ,int num2);
}
(2)定义具体的策略角色,代码如下所示:
/**
* 具体的加法策略角色
*
* */
public class AddStrategy implements Strategy {
/**
* 实现calc方法,两个数相加。
* */
public int calc(int num1, int num2) {
return num1 + num2;
}
}
/**
* 具体的减法策略角色
*
* */
public class SubStrategy implements Strategy {
/**
* 实现calc方法,两个数减法计算。
* */
public int calc(int num1