亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

舉例講解iOS應用開發中對設計模式中的策略模式的使用

2020-07-26 03:24:21
字體:
來源:轉載
供稿:網友

策略模式是一種常見的軟件設計模式,這里簡單得介紹一下策略模式并用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:&regError];
   
   
    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:&regError];
   
   
    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的。其次,多態更多強調的是,不同的對象調用同一個方法會得到不同的結果,而策略模式更多強調的是,同一個對象(事實上這個對象本身并不重要)在不同情況下執行不同的方法,而他們的實現方式又是高度類似的,即共享同一個父類并且各自重寫父類的方法。

以上觀點純屬個人愚見,歡迎大牛指正,互相交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91精品青草社区| 国产精品福利在线观看| 乱亲女秽乱长久久久| 国产精品一二三在线| 全球成人中文在线| 国产欧美精品在线播放| 日韩精品视频中文在线观看| 亚洲日韩中文字幕| 亚洲成人av在线| 国产精品一区二区三区久久久| 成人a级免费视频| 日韩h在线观看| 国产精品欧美风情| 亚洲色图色老头| 国产香蕉精品视频一区二区三区| 亚洲精品视频在线观看视频| 成人精品一区二区三区电影免费| 成人在线观看视频网站| 最新国产精品拍自在线播放| 亚洲精品一区中文| 欧美老女人性视频| 国产精品黄视频| 亚洲色图15p| 亚洲精品久久久久| 国产精品一久久香蕉国产线看观看| 亚洲性xxxx| 亚洲无亚洲人成网站77777| 欧洲亚洲免费视频| 色777狠狠综合秋免鲁丝| 亚洲国产一区二区三区在线观看| 国产日韩欧美综合| 日韩精品中文字幕有码专区| 国产精品www网站| 国产一区二区三区高清在线观看| 久久偷看各类女兵18女厕嘘嘘| 深夜福利一区二区| 91免费精品国偷自产在线| 亚洲无限乱码一二三四麻| 色综合视频网站| 亚洲国产精品va在看黑人| 综合136福利视频在线| 欧美日本国产在线| 亚洲欧洲偷拍精品| 亚洲国产天堂网精品网站| 亚洲欧洲在线视频| 国产原创欧美精品| 九九热99久久久国产盗摄| 欧美极品欧美精品欧美视频| 97视频在线观看免费| 久久成人国产精品| 日韩av网址在线| 福利视频导航一区| 精品自拍视频在线观看| 欧美亚洲第一区| 在线观看日韩专区| 欧美精品在线免费| 91久久国产婷婷一区二区| 精品国产乱码久久久久酒店| 狠狠做深爱婷婷久久综合一区| 亚洲国产女人aaa毛片在线| 欧美激情久久久久久| 成人久久久久爱| 色偷偷噜噜噜亚洲男人| 欧美视频一二三| 在线电影中文日韩| 亚洲免费视频在线观看| 一级做a爰片久久毛片美女图片| 国产精品99一区| 久久精品国产一区| 亚洲精品98久久久久久中文字幕| 欧美精品videos另类日本| 一区二区三区 在线观看视| 欧美亚洲激情在线| 欧美性xxxx极品hd满灌| 久久99精品国产99久久6尤物| 欧美成人精品在线| 黑人巨大精品欧美一区二区| 57pao国产成人免费| 日韩欧美aaa| 精品国产一区av| 欧美激情视频在线免费观看 欧美视频免费一| 欧美激情亚洲一区| 亚洲国产福利在线| 欧美性猛交xxxx乱大交3| 66m—66摸成人免费视频| 欧美一级高清免费播放| 成人在线国产精品| 亚洲人成电影在线| 97人人模人人爽人人喊中文字| 亚洲成人999| 欧美国产视频一区二区| 成人在线视频网站| 久久视频在线播放| 欧美国产中文字幕| 日本欧美黄网站| 91av国产在线| 国产精品96久久久久久又黄又硬| 久久影视三级福利片| 国产免费一区二区三区香蕉精| 日韩成人久久久| 日本久久亚洲电影| 日产日韩在线亚洲欧美| 69视频在线播放| 九九热最新视频//这里只有精品| 午夜精品久久久久久久久久久久| 日韩网站免费观看高清| 欧美电影免费观看电视剧大全| 97在线观看视频| 日韩有码在线视频| 亚洲色图av在线| 欧美精品一区二区三区国产精品| 国产精品成人在线| 日韩精品久久久久久福利| 成人黄在线观看| 亚洲欧美制服中文字幕| 国产精品爽黄69天堂a| 一本大道亚洲视频| 久久香蕉国产线看观看av| 国产精品久久久久秋霞鲁丝| 亚洲美女av黄| 欧美日韩亚洲成人| 欧美日本亚洲视频| 欧美性20hd另类| 色视频www在线播放国产成人| 亚洲成人激情小说| 欧洲日韩成人av| 日韩精品免费在线播放| 伊人成人开心激情综合网| 国产精品ⅴa在线观看h| 69av在线视频| 菠萝蜜影院一区二区免费| 91免费人成网站在线观看18| 国产精品久久久久久久久久久不卡| 国产精品久久久久9999| 亚洲最大的成人网| 九九热在线精品视频| 国内精品小视频| 国产乱人伦真实精品视频| 久久视频国产精品免费视频在线| 国产一区二区激情| 久久国产精品免费视频| 少妇av一区二区三区| 久久久久久久国产| 久久99精品久久久久久青青91| www.久久久久久.com| 日韩精品免费在线视频观看| 国产精品久久久久久久久久| 亚洲理论片在线观看| 欧美激情国内偷拍| 日韩免费在线看| 久久午夜a级毛片| 亚洲欧美变态国产另类| 日本国产欧美一区二区三区| 日韩免费在线看| 欧美精品亚州精品| 欧美日韩福利在线观看| 久久偷看各类女兵18女厕嘘嘘| 国产日本欧美视频| 亚洲欧美综合精品久久成人| 国产精品久久久久久av| 最近2019免费中文字幕视频三| 91超碰中文字幕久久精品| 精品女厕一区二区三区| 欧美成人免费在线观看|