简单概述:
先说下官话策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。举个例子就比如说我们有很多个if else 判断if else判断就拿下面的代码来举个例子,就比如我们是要根据某个特定的条件去判断做不一样的处理的话,我们堆在一起,这样根据条件判断的语句会变得很长以后看起来其实也很难的去维护,所以我们可以考虑利用策略模式来做。
策略模式的应用其实就是针对同一类型的问题多种处理方式,仅仅只是具体的行为有差别,比如说对于处理一个业务我们有多个方法,这样的话我们不方便将所有的方法写在一个类里面,这个时候我们可以去写一个协议,将方法给声明出来,然后我们再进行处理
int i=1;
if(i==1)
{
}
else if(i==2)
{
}
else if(i==3)
{
}
else
{
}
策略模式的话其实就是这样的我们对于每一种情况自己去设计一个算法,这样集合成一个算法族在要调用的时候去调用其实就可以了。就比如说可能我们会在给为顾客服务推销的时候我们会根据顾客现在拥有的钱的数量给顾客安排不同的购买方案,如果需要这样的话其实我们就可以先定义一个抽象类,抽象类里面拥有一个根据顾客所拥有的钱数去判断给顾客推销什么,但是里面得到业务逻辑是没有处理的是抽象方法,然后再给每种情况去创建一个类继承这个抽象类去实现相应的代码,这样的话代码就会比较好维护,当然为了更简单的话其实我们还可以去创建一个类context,让这个类引用着那个抽象类,这样我们的只需要去和这个context类交互就可以了,这样外面的类调用的时候知道的事情越少越好,为了更好的理解其实可以看张图。
就比如说我有一个context的实例,我们在使用的时候,可以使用不同的strategy对象来进行配置,这就是对这个context实例的一个策略。
其实视图和控制器就是一种基于策略模式的关系,因为控制器是决定视图对模型数据进行展示的时间和内容,而同一个视图是可能会被用到不同的控制器的,这样的话就说明不同控制器其实就是不同的策略,所以可以说是基于策略模式的实现。
一般来说策略模式用在一个类中在操作的时候要使用大量的if else或者是switch case来定位许多的行为,我们可以把相关的条件分支转到它们的策略类当中,还有就是需要算法的各种变体的,另外一种就是需要避免把复杂的和与算法相关的数据结构暴露给客户端的。
应用场景:
比如说加密算法,我们就可以利用策略模式,因为其实加密算法有很多中比如说AES加密算法、DES加密算法、自定义加密算法等等,这样的话我们完全可以抽象出一个协议出来,然后定义的一些加密算法的工具类去实现这个协议,然后去做方法
#import <Foundation/Foundation.h>
//策略的接口
@protocol StrategyEncryption <NSObject>
//加密
-(NSString*)encrypt:(NSString*)data key:(NSString*)key iv:(NSData*)iv;
//解密
-(NSString*)decrypt:(NSString*)data key:(NSString*)key iv:(NSData*)iv;
@end
其实就是对于策略模式的应用场景的总结和好处,就是我们定义了一些了的算法,每一个算法都是可以单独封装的,每一个算法都是可以相互替换的,还有就是调用者可以独立的去变化算法