策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。看到策略模式的时候有的时候跟简单工厂相比较,其实有很大的迷惑性,都是继承多态感觉没有太大的差异性,简单工厂模式是对对象的管理,策略模式是对行为的封装。可以先简单的看一下结构图:
之前简单工厂是通过银行卡作为例子的简单工厂将不同的银行卡抽象出来,如果在策略模式中我们可以将每张银行卡的购物,吃饭,住房。。作为一个简单的消费策略抽象出来,也可以以操作系统类比,Windows,OS X,Linux可以作为简单的对象抽象,系统中都是有默认软件的,我们不需要管软件的安装,如果没有软件的话我们就需要自己下载,可以将软件的安装作为一个策略封装起来。
Strategy的抽象类:
@interface SoftWareStrategy : NSObject -(void)installStrategy; @end
继承Strategy的Xcode的策略类:
@implementation XcodeStrategy -(void)installStrategy{ NSLog(@"Xcode安装成功"); } @end
继承Strategy的QQ的策略类:
@implementation QQStrategy -(void)installStrategy{ NSLog(@"QQ安装成功"); NSLog(@"原文地址:http://www.cnblogs.com/xiaofeixiang"); } @end
Context类:
typedef NS_OPTIONS(NSInteger, StrategyType){ StrategyXcode, strategyQQ }; @interface SoftWareContext : NSObject -(instancetype)initWithStrategyType:(StrategyType)strategyType; -(void)installResult; @end
Context的实现:
@interface SoftWareContext() @property (strong,nonatomic) SoftWareStrategy *strategy; @end @implementation SoftWareContext -(instancetype)initWithStrategyType:(StrategyType)strategyType{ self=[super init]; if (self) { switch (strategyType) { case StrategyXcode: self.strategy=[[XcodeStrategy alloc]init]; break; case strategyQQ: self.strategy=[[QQStrategy alloc]init]; break; } } return self; } -(void)installResult{ [self.strategy installStrategy]; } @end
最终调用:
SoftWareContext *context=[[SoftWareContext alloc]initWithStrategyType:StrategyXcode]; [context installResult];
这里有三个概念再看一下应该就清晰多了:
环境(Context)角色:持有一个Strategy的引用;
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口;
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为;