你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 舉例講授iOS運用開辟中對設計形式中的戰略形式的應用

舉例講授iOS運用開辟中對設計形式中的戰略形式的應用

編輯:IOS開發綜合

戰略形式是一種罕見的軟件設計形式,這裡簡略得引見一下戰略形式並用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

成果:當我們輸出的不知足前提的時刻就會顯示提醒信息,而知足前提就不會有任何提醒。

長處

  • 戰略形式是一種界說一系列算法的辦法,從概念下去看,一切這些算法完成的都是雷同的任務,只是完成分歧,它可以以雷同的方法挪用一切的算法,削減了各類算法類與應用算法類之間的耦合。
  • 戰略形式的Stategy類條理為Context界說了一些列的可供重用的算法或行動。繼續有助於析掏出算法中的公共功效。
  • 戰略形式的長處是簡化了單位測試,由於每一個算法都有本身的類,可以經由過程本身的接口零丁測試。

應用場景

  • 一個類在其操作中應用多個前提語句來界說很多行動。我們可以把相干的前提分支移到他們本身的戰略類中
  • 須要算法的各類變體
  • 須要防止把龐雜的、與算法相干的數據構造裸露給客戶端

總結
再總結一下戰略辦法的完成,實質上就是須要完成一個工作(出行),然則其實不清晰須要應用如何的戰略,所以封裝出一個函數,可以或許把須要的戰略(young OR old)作為參數傳遞出去,而且應用響應的戰略完成這個事宜的處置。

最初簡略談一談小我關於戰略形式和面向對象中多態的思惟的懂得,起首多態是高條理,高度籠統的概念,自力於說話以外,是面向對象思惟的精華,而戰略形式只是一種軟件設計形式,絕對而言加倍詳細,並且詳細完成依附於詳細的編程說話,好比OC和java的完成辦法其實不雷同,是language-dependent的。其次,多態更多強調的是,分歧的對象挪用統一個辦法會獲得分歧的成果,而戰略形式更多強調的是,統一個對象(現實上這個對象自己其實不主要)在分歧情形下履行分歧的辦法,而他們的完成方法又是高度相似的,即同享統一個父類而且各自重寫父類的辦法。

以上不雅點純屬小我鄙意,迎接年夜牛斧正,相互交換。

【舉例講授iOS運用開辟中對設計形式中的戰略形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved