策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用iOS简单实现一下。
所谓的策略模式,顾名思义是要采用不同的策略的。一般来说,在不同的情况下,处理某一个问题的方法也不一样。比如说对字符串的排序和对数字的排序,虽然用的都是快排,但是显然不可能使用一段通用的代码。有人说Java里面的compareTo可以做到,但如果考虑这么一个问题:同样是出门旅行,老年人身体虚弱,需要大量的休息,而孩子则是精力充沛,希望玩到更多的景点。如何在同一模式下表达以上信息、采用合理的设计模式进行封装而不是大量重写类似的代码,就需要学习并采用策略模式。
首先建立一个通用的策略,这里直接命名为Strategy。这个类是最终暴露出来,需要被调用的类。
//Strategy.h
#import <Foundation/Foundation.h>
@interface Strategy : NSObject
- (void) go;
@end
这个类比较简单,只定义了一个go方法。
//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,通过传入不同的参数(策略),就可以调用这个策略下具体的方法实现。运行结果表示策略模式已经成功的实现了。通过调用不同的策略,得到了不同的处理结果。
2015-04-25 11:00:39.815 ios练习[27207:1752975] I am going outside
2015-04-25 11:00:39.815 ios练习[27207:1752975] I am old, I need rest
2015-04-25 11:00:39.816 ios练习[27207:1752975] I am going outside
2015-04-25 11:00:39.816 ios练习[27207:1752975] I am young, I am energetic
再总结一下策略方法的实现,本质上就是需要完成一个事情(出行),但是并不清楚需要使用怎样的策略,所以封装出一个函数,能够把需要的策略(young OR old)作为参数传递进来,并且使用相应的策略完成这个事件的处理。
最后简单谈一谈个人对于策略模式和面向对象中多态的思想的理解,首先多态是高层次,高度抽象的概念,独立于语言之外,是面向对象思想的精髓,而策略模式只是一种软件设计模式,相对而言更加具体,而且具体实现依赖于具体的编程语言,比如OC和java的实现方法并不相同,是language-dependent的。其次,多态更多强调的是,不同的对象调用同一个方法会得到不同的结果,而策略模式更多强调的是,同一个对象(事实上这个对象本身并不重要)在不同情况下执行不同的方法,而他们的实现方式又是高度类似的,即共享同一个父类并且各自重写父类的方法。
以上观点纯属个人愚见,欢迎大牛指正,互相交流。
转载网址 : http://blog.csdn.net/abc649395594/article/details/45258805