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