CustomTextField.h中CustomTextField的类声明
复制代码#import <UIKit/UIKit.h>
#import "InputValidator.h"
@interface CustomTextField : UITextField
@property (nonatomic, strong) InputValidator *inputValidator; //用一个属性保持对InputValidator的引用。
- (BOOL)validate;
@end
CustomTextField有一个属性保持着对InputValidator的引用。当调用它的validate方法时,它会使用这个InputValidator引用,开始进行实际的验证过程。
CustomTextField.m中CustomTextField的实现
复制代码#import "CustomTextField.h"
@implementation CustomTextField
- (BOOL)validate {
NSError *error = nil;
BOOL validationResult = [_inputValidator validateInput:self error:&error];
if (!validationResult) {
// 通过这个例子也让自己明白了,NSError的具体用法。
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:[error localizedDescription] message:[error localizedFailureReason] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
}
return validationResult;
}
@end
validate方法向inputValidator引用发送了[_inputValidator validateInput:self error:&error]消息。CustomTextField无需知道使用的是什么类型的InputValidator以及算法的任何细节,这就是策略模式的好处。对于客户端使用来说,只需要调用validate方法就可以了。因此在将来如果添加了新的InputValidator,客户端不需要做任何的改动的。
下面,我们看下客户端是怎么使用的,代码如下。
复制代码#import "ViewController.h"
#import "CustomTextField.h"
#import "InputValidator.h"
#import "NumberInputValidator.h"
#import "AlphaInputValidator.h"
@interface ViewController () <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet CustomTextField *numberTF;
@property (weak, nonatomic) IBOutlet CustomTextField *alphaTF;
@end










