动机
- 完成一项任务可以有多种不同的方法,每一种方法都可称为一个策略。在特定环境下,我们可以根据不同的需求和具体的环境来决定采用哪一个策略来完成特定的任务;
- 在软件开发中也是类似的,我们可以使用不同的策略来实现一项功能。比如排序,可以**采用快排(Quick Sort),插入排序(Insert Sort)或选择排序(Selection Sort)**等等。这些不同的排序算法都能实现排序功能,只是他们进行排序时的效率不同。因此,我们要根据具体的情况,来具体选择一个排序算法,以使得在当前情况中排序效率最高;
- 为了使系统具有较强的扩展性(可能在未来,我们还需要增加新的排序算法),我们的代码需要遵循开闭原则(The Open Closed Principle);
- 同时,我们编写的这个类对应的调用者(Client),不应该依赖于这个类具体的实现(Implementation),而仅仅依赖于对应的抽象(Abstraction)。或者说,面向接口编程(Program to an interface, not an implementation);
- 可能有人会提出,我们可以编写一个
SortingHelper
类(这个类实现了ISortingHelper
接口),这个类中包含不同的方法,每个方法都是一种具体排序算法的实现(比如快排、插入排序等等)。很棒!这是一种很好的实现(具有扩展性,同时面向接口编程)。这种实现事实上对应了另一个设计模式,称为模板方法模式(Template Method Pattern)。但这样的实现无法做到在运行时可以任意地切换不同的排序算法; - 我们也可以设计一个策略接口(对应于上面例子,则为排序帮助接口),同时包含多个实现了该接口的策略实现类(对应于上面例子,则为XX排序帮助类,如插入排序帮助类)。