戰略形式是一種罕見的軟件設計形式,這裡簡略得引見一下戰略形式並用IOS簡略完成一下。
所謂的戰略形式,望文生義是要采取分歧的戰略的。普通來講,在分歧的情形下,處置某一個成績的辦法也紛歧樣。好比說對字符串的排序和對數字的排序,固然用的都是快排,然則明顯弗成能應用一段通用的代碼。有人說java外面的compareTo可以做到,但假如斟酌這麼一個成績:異樣是出門觀光,老年人身材衰弱,須要年夜量的歇息,而孩子則是精神充分,願望玩到更多的景點。若何在統一形式下表達以上信息、采取公道的設計形式停止封裝而不是年夜量重寫相似的代碼,就須要進修並采取戰略形式。
例子
該例子重要應用戰略形式來斷定UITextField能否知足輸出請求,好比輸出的只能是數字,假如只是數字就沒有提醒,假如有其他字符則提醒失足。驗證字母也是一樣。
起首,我們先界說一個籠統的戰略類IputValidator。代碼以下:
InputValidator.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
static NSString * const InputValidationErrorDomain = @"InputValidationErrorDomain";
@interface InputValidator : NSObject
//現實驗證戰略的存根辦法
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error;
@end
InputValidator.m
#import "InputValidator.h"
@implementation InputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error
{
if (error) {
*error = nil;
}
return NO;
}
@end
這個就是一個戰略基類,然後我們去創立兩個子類NumericInputValidator和AlphaInputValidator。詳細代碼以下:
NumericIputValidator.h
#import "InputValidator.h"
@interface NumericInputValidator : InputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error;
@end
NumericIputValidator.m
#import "NumericInputValidator.h"
@implementation NumericInputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error
{
NSError *regError = nil;
//應用設置裝備擺設的NSRegularExpression對象,檢討文本框中數值型的婚配次數。
//^[0-9]*$:意思是從行的開首(表現為^)到開頭(表現為$)應當稀有字集(標示為[0-9])中的0或許更多個字符(表現為*)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:®Error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:[input text] options:NSMatchingAnchored range:NSMakeRange(0, [[input text] length])];
//假如沒有婚配,就前往毛病和NO
if (numberOfMatches==0) {
if (error != nil) {
NSString *description = NSLocalizedString(@"Input Validation Faild", @"");
NSString *reason = NSLocalizedString(@"The input can contain only numerical values", @"");
NSArray *objArray = [NSArray arrayWithObjects:description,reason, nil];
NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey,NSLocalizedFailureReasonErrorKey ,nil];
NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray];
*error = [NSError errorWithDomain:InputValidationErrorDomain code:1001 userInfo:userInfo];
}
return NO;
}
return YES;
}
@end
AlphaInputValidator.h
#import "InputValidator.h"
@interface AlphaInputValidator : InputValidator
- (BOOL)validateInput:(UITextField *)input error:(NSError **)error;
@end
AlphaInputValidator.m
#import "AlphaInputValidator.h"
@implementation AlphaInputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error
{
NSError *regError = nil;
//應用設置裝備擺設的NSRegularExpression對象,檢討文本框中數值型的婚配次數。
//^[0-9]*$:意思是從行的開首(表現為^)到開頭(表現為$)應當稀有字集(標示為[0-9])中的0或許更多個字符(表現為*)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:®Error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:[input text] options:NSMatchingAnchored range:NSMakeRange(0, [[input text] length])];
//假如沒有婚配,就前往毛病和NO
if (numberOfMatches==0) {
if (error != nil) {
NSString *description = NSLocalizedString(@"Input Validation Faild", @"");
NSString *reason = NSLocalizedString(@"The input can contain only letters ", @"");
NSArray *objArray = [NSArray arrayWithObjects:description,reason, nil];
NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey,NSLocalizedFailureReasonErrorKey ,nil];
NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray];
*error = [NSError errorWithDomain:InputValidationErrorDomain code:1002 userInfo:userInfo];
}
return NO;
}
return YES;
}
@end
他們兩個都是InputValidator的子類。然後再界說一個CustomTextField:
CustomTextField.h
#import <UIKit/UIKit.h>
@class InputValidator;
@interface CustomTextField : UITextField
@property(nonatomic,strong)InputValidator *inputValidator;
-(BOOL)validate;
@end
CustomTextField.m
#import "CustomTextField.h"
#import "InputValidator.h"
@implementation CustomTextField
-(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];
}
return validationResult;
}
@end
最初在ViewController中測試能否完成驗證
ViewController.m
#import "ViewController.h"
#import "CustomTextField.h"
#import "NumericInputValidator.h"
#import "AlphaInputValidator.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_numberTextField.inputValidator = [NumericInputValidator new];
_letterTextField.inputValidator = [AlphaInputValidator new];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - ValidButtonMehtod
- (IBAction)validNumAction:(id)sender {
[_numberTextField validate];
}
- (IBAction)validLetterAction:(id)sender {
[_letterTextField validate];
}
@end
成果:當我們輸出的不知足前提的時刻就會顯示提醒信息,而知足前提就不會有任何提醒。
長處
應用場景
總結
再總結一下戰略辦法的完成,實質上就是須要完成一個工作(出行),然則其實不清晰須要應用如何的戰略,所以封裝出一個函數,可以或許把須要的戰略(young OR old)作為參數傳遞出去,而且應用響應的戰略完成這個事宜的處置。
最初簡略談一談小我關於戰略形式和面向對象中多態的思惟的懂得,起首多態是高條理,高度籠統的概念,自力於說話以外,是面向對象思惟的精華,而戰略形式只是一種軟件設計形式,絕對而言加倍詳細,並且詳細完成依附於詳細的編程說話,好比OC和java的完成辦法其實不雷同,是language-dependent的。其次,多態更多強調的是,分歧的對象挪用統一個辦法會獲得分歧的成果,而戰略形式更多強調的是,統一個對象(現實上這個對象自己其實不主要)在分歧情形下履行分歧的辦法,而他們的完成方法又是高度相似的,即同享統一個父類而且各自重寫父類的辦法。
以上不雅點純屬小我鄙意,迎接年夜牛斧正,相互交換。
【舉例講授iOS運用開辟中對設計形式中的戰略形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!