标签:策略模式
我们先设想一个场景:把一堆算法塞到同一段代码里,然后用if - else 和switch - case 来决定使用哪个算法。
比如:表单验证,数据本身可能是NSString, NSInteger, NSFloat... 有时候不仅要验证类型还需要验证长度,或者还有其他的验证... 如果用if,有时候真感觉那是一场噩梦。 赶紧醒醒吧,加上一个策略模式。wow,世界顿时变得很美好。
何为策略模式:
官方定义:定义一系列算法,把他们一个个封装起来,并且是他们可以相互替换。这种模式使得算法可以独立于使用它的客户端而存在。
直接上例子:
有一个CustomTextField需要验证,然后就有一个InputValidator(验证的基类)以及一系列验证的子类, AlphaInputValidator, NumericInputValidator...
1. 在你的controller里面,入口处直接调用:
[(CustomTextField*)textField validate];
2. CustomTextField实现类:
@implementation CustomTextField
@synthesize inputValidator=inputValidator_;
- (BOOL) validate {
NSError *error = nil;
BOOL validationResult = [inputValidator_ validateInput:self error:&error];
if (!validationResult) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
message:[error localizedFailureReason]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", @"")
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
return validationResult;
}
@end
@implementation InputValidator
// A stub for any actual validation strategy
- (BOOL) validateInput:(UITextField *)input error:(NSError **) error {
if (error) {
*error = nil;
}
return NO;
}
接着在 AlphaInputValidator, NumericInputValidator里写相关的实现。
好了,现在对策略模式有些了解了。我们再来看看
何时使用策略模式:
1. 一个类在其操作中使用多个条件语句来定义许多行为。我们可以把条件分支移到他们自己的策略类里面。
2. 需要算法的各种变体。
3. 需要避免把复杂的,与算法相关的数据结构暴露给客户端。
标签:策略模式
原文地址:http://blog.csdn.net/u011374880/article/details/41844303