设计模式这一概念最初源于建筑学,它的提出者克里斯托弗-亚历山大认为建筑设计要围绕以人为本的目的。建筑物要基于社会和人性来设计,程序设计亦是如此。
虽然简单套用模式并不能解决所有问题,但是模式这一理念对一些广泛的基础场景指出了最佳实践,是一种务实的分析和设计方法,是值得程序设计者学习和理解的,并时刻提醒设计者,设计模式的核心意义就是以人为本,设计要服务于人。
1994年,由四位面向对象领域专家合著出版了《设计模式:可复用面向对象软件的基础》,这本书中介绍了程序设计中常用的23中设计模式。这篇文章将介绍其中之一-策略模式。

​模式简介

策略模式是一种行为型模式。其核心是定义一系列的算法,把它们逐个封装起来,并使它们可以互相替换,本模式使得算法可以独立于使用它们的客户。

现实举例

​作为普通用户,我们使用支付宝或者其他网络支付时是感受不到后台的加密算法的,即便后台的加密算法发生了更新和修改,前端用户在操作上也感觉不到有什么不同。

同样,在玩网络游戏时,也是看不到后台的压缩数据算法的,后台一些算法的修改也是不会影响到玩家的操作的。

即便是业内的程序员,作为算法的使用者,我们也是需要了解算法的功能、特性、输入输出的要求,就可以通过对一些封装算法的调用,的出计算结果,完成业务逻辑,而不用完全理解算法的原理细节。

比如排序算法,我们要对一个内标进行排序,可以使用Binary Search、Secondary key search等算法,而不必考虑内部的算法是如何实现的。

如果我们能够定义一系列的算法,将每一个算法都封装起来,并根据需要可以灵活调用或替换算法,让算法独立于我们的调用程序,那么这样的一个模式就是策略模式。

程序设计分析

​当调用者使用算法进行计算时,怎样才能不影响调用者的调用,而对算法进行替换操作呢?

将算法的定义与使用分开,让调用者依赖于抽象的算法定义的抽象类(依赖倒置原则),当出现新的算法时,只需要增加一个新的现实类即可。

解决方案

​定义一个抽象的算法类,然后定义一系列的算法实现类,这些实现类可以相互替换,这样就可以让算法独立于调用者的调用。

我们可以将具体的策略类的类名称存储到定制化的列表中,动态创建具体的策略对象,从而可以灵活覅更换具体策略算法类。增加新的具体策略算法类也很方便,不会影响已有的代码。