iOS应用运用设计模式中的Strategy策略模式的开发实例

2020-01-14 22:14:28刘景俊

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