iOS 策略模式附Demo

吃粑粑的畢教授發表於2017-12-23

策略模式

原文連結 : 連結 jianshu地址 : 連結 定義一系列的演算法, 並且將每一個演算法封裝起來, 演算法之間還可以相互替換 可以看下圖來體會

iOS 策略模式附Demo

demo演示

需求簡單做一個只接收字母, 只接收數字的demo, 驗證登入

如下圖所示:

iOS 策略模式附Demo

基本步驟

那麼我們可以這樣寫--->( 此時全部在控制器中,並沒有進行抽取 ) 定義

@property (weak, nonatomic) IBOutlet UITextField *letterInput;//字母輸入
@property (weak, nonatomic) IBOutlet UITextField *numberInput;//數字輸入
複製程式碼

演算法

#pragma mark -驗證輸入
- (NSString*)letterInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//從開頭到結尾,有效字符集合a-zA-Z或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];
NSString *outLetter = nil;
//判斷,匹配不符合為0
if(numberOfMateches == 0){
outLetter = @"請重新輸入";
}else{
outLetter = @"輸入正確";
}
return outLetter;
}
- (NSString*)numberInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//從開頭到結尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];
NSString *outLetter = nil;
//判斷,匹配不符合為0
if(numberOfMateches == 0){
outLetter = @"請重新輸入";
}else{
outLetter = @"輸入正確";
}
return outLetter;
}
複製程式碼

代理

#pragma mark -代理
- (void)textFieldDidEndEditing:(UITextField *)textField{
if(textField == self.letterInput){
//驗證輸入值
NSString *outPut = [self letterInput:textField];
if (outPut) {
NSLog(@"--%@",outPut);
}else{
NSLog(@"未輸入");
}
}else if(textField == self.numberInput){
//驗證是數字
NSString *outPut = [self numberInput:textField];
if (outPut) {
NSLog(@"--%@",outPut);
}else{
NSLog(@"未輸入");
}
}
}
複製程式碼

此時並沒有進行抽取

策略模式進行抽取

iOS 策略模式附Demo

首先我們來根據上圖的思路來建立一個抽象類---InputTextField類

宣告

//策略輸入 YES 通過
//NO 不通過
- (BOOL)inputTextField:(UITextField *)textField;
@property (nonatomic,copy)NSString *attributeInputStr;//屬性字元
複製程式碼

抽象方法

- (BOOL)inputTextField:(UITextField *)textField{
return NO;
}
複製程式碼

場景類---CustomTextField

同樣我們來宣告一個BOOL型別驗證方法, 並將抽象類匯入, 之前屬於一個聚合的關係

@property (nonatomic,strong)InputTextField *inputTextField;//抽象策略類
//驗證方法
- (BOOL)isOK;
複製程式碼

實現

- (BOOL)isOK{
BOOL result = [self.inputTextField inputTextField:self];
if(!result){
NSLog(@"--%@",self.inputTextField.attributeInputStr);
}
return result;
}
複製程式碼

實現類---LetterInput, ---NumberInput, 這兩個類全部是繼承於抽象類的

此時我們開始寫實現

- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"字母輸入為空";
return nil;
}
//從開頭到結尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];

//判斷,匹配不符合為0
if(numberOfMateches == 0){
self.attributeInputStr = @"請重新輸入";
}else{
self.attributeInputStr = @"輸入正確";
}
return self.attributeInputStr == nil ? YES : NO;
}
複製程式碼
- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"數字輸入為空";
return nil;
}
//從開頭到結尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];

//判斷,匹配不符合為0
if(numberOfMateches == 0){
self.attributeInputStr = @"請重新輸入";
}else{
self.attributeInputStr = @"輸入正確";
}
return self.attributeInputStr == nil ? YES : NO;
}
複製程式碼

控制器中實現

父類指標指向子類物件

self.letterInput.inputTextField = [LetterInput new];
self.numberInput.inputTextField = [NumberInput new];
複製程式碼

呼叫

- (void)textFieldDidEndEditing:(UITextField *)textField{
if ([textField isKindOfClass:[CustomTextField class]]) {
[(CustomTextField *)textField inputTextField];
}
}
複製程式碼

總結

假如說我們又多了一個策略, 只需要再次增加一個類, 增加一個演算法直接呼叫, 這樣的話就在Controller中僅僅建立一個類就可以了, 對於後期的程式碼維護是不是方便了許多呢? 好了, 給大家這個簡單demo, 當然在程式碼中也寫了註釋, 可以去我的git下載, 歡迎star 下載連結 : demo地址 技術交流q群150731459

相關文章