策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用IOS简单实现一下。
所谓的策略模式,顾名思义是要采用不同的策略的。一般来说,在不同的情况下,处理某一个问题的方法也不一样。比如说对字符串的排序和对数字的排序,虽然用的都是快排,但是显然不可能使用一段通用的代码。有人说java里面的compareTo可以做到,但如果考虑这么一个问题:同样是出门旅行,老年人身体虚弱,需要大量的休息,而孩子则是精力充沛,希望玩到更多的景点。如何在同一模式下表达以上信息、采用合理的设计模式进行封装而不是大量重写类似的代码,就需要学习并采用策略模式。
首先建立一个通用的策略,这里直接命名为Strategy。这个类是最终暴露出来,需要被调用的类。
//Strategy.h
#import <Foundation/Foundation.h>
@interface Strategy : NSObject
- (void) go;
@end
//Strategy.m
#import "Strategy.h"
@implementation Strategy
- (void)go{
NSLog(@"I am going outside");
}
@end
.m方法里并没有过多的实现go方法,可以看到只写了一个NSLog,其实也完全可以不写。这个类有点接近于java中的interface和C++中的纯虚类。因为这个是一个通用的,暴露出来的接口,所以具体的实现并不需要在strategy类中的go方法内完成。
接下来定义两个类,分别继承自Strategy类,这两个类中包含了具体的方法实现,是功能的主体部分。
//OldPeopleTravel.h
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface OldPeopleTravel : Strategy
- (void) go;
@end
.m文件里是具体的针对对老年人的实现方法
//OldPeopleTravel.h
#import "OldPeopleTravel.h"
@implementation OldPeopleTravel
-(void)go{
[super go];
NSLog(@"I am old, I need rest");
}
@end
类似的还有YoungPeopleTravel的.h和.m文件
//YoungPeopleTravel.h
#import "Strategy.h"
@interface YoungPeopleTravel : Strategy
- (void) go;
@end
//YoungPeopleTravel.m
#import "YoungPeopleTravel.h"
@implementation YoungPeopleTravel
- (void) go{
[super go];
NSLog(@"I am young, I am energetic");
}
@end
以上是策略类和具体的实现类的实现,接下来就是调用这个策略了。
//ViewController.m
#import "ViewController.h"
#import "Strategy.h"
#import "OldPeopleTravel.h"
#import "YoungPeopleTravel.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self goOutside:[[OldPeopleTravel alloc]init]];
[self goOutside:[[YoungPeopleTravel alloc]init]];
}
- (void)goOutside:(id)theStrategy{
Strategy *strategy = theStrategy;
[strategy go];
}
@end
可以看到,最终我们调用的是自己的goOutside方法,方法中有一个参数是strategy,通过传入不同的参数(策略),就可以调用这个策略下具体的方法实现。运行结果表示策略模式已经成功的实现了。通过调用不同的策略,得到了不同的处理结果。