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

首頁 > 學院 > 開發設計 > 正文

iOS設計模式之策略模式

2019-11-14 18:34:19
字體:
來源:轉載
供稿:網友

策略模式(Strategy)

基本理解

  • 面向對象的編程,并不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。
  • 策略模式:它定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。
  • 簡單工廠模式需要讓客戶端認識兩個類,而策略模式和簡單工廠結合的用法,客戶端只需要認識一個類就可以了。耦合更加降低。
  • 當不同的行為堆砌在一個類中時,就很難避免使用條件語句來選擇合適的行為。將這些行為封裝在一個個獨立的Strategy類中,可以再使用這些行為的類中消除條件語句。
  • 策略模式就是用來封裝算法的,但在實踐中,我們發現用它來封裝幾乎任何類型的規則,只要在分析過程中聽到了需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
  • 在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,并轉給策略模式的Context對象。
  • 面向對象軟件設計中,我們可以把相關算法分離為不同的類,成為策略。
  • 策略模式中的一個關鍵角色是策略類,它為所有支持的或者相關的算法聲明了一個共同接口。
  • 控制器和試圖之間是一種基于策略模式的關系。

優點

  • 策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法類與使用算法類之間的耦合。
  • 策略模式的Stategy類層次為Context定義了一些列的可供重用的算法或行為。繼承有助于析取出算法中的公共功能。
  • 策略模式的優點是簡化了單元測試,因為每個算法都有自己的類,可以通過自己的接口單獨測試。

使用場景

  • 一個類在其操作中使用多個條件語句來定義許多行為。我們可以把相關的條件分支移到他們自己的策略類中
  • 需要算法的各種變體
  • 需要避免把復雜的、與算法相關的數據結構暴露給客戶端

例子

該例子主要利用策略模式來判斷UITextField是否滿足輸入要求,比如輸入的只能是數字,如果只是數字就沒有提示,如果有其他字符則提示出錯。驗證字母也是一樣。
首先,我們先定義一個抽象的策略類iputValidator。代碼如下:
InputValidator.h

  	////  InputValidator.h//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#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

////  InputValidator.m//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "InputValidator.h"@implementation InputValidator-(BOOL)validateInput:(UITextField *)input error:(NSError **)error{    if (error) {        *error = nil;    }    return NO;}@end

這個就是一個策略基類,然后我們去創建兩個子類NumericInputValidator和AlphaInputValidator。具體代碼如下:
NumericIputValidator.h

////  NumericInputValidator.h//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "InputValidator.h"@interface NumericInputValidator : InputValidator-(BOOL)validateInput:(UITextField *)input error:(NSError **)error;@end

NumericIputValidator.m

////  NumericInputValidator.m//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#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

////  AlphaInputValidator.h//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import "InputValidator.h"@interface AlphaInputValidator : InputValidator- (BOOL)validateInput:(UITextField *)input error:(NSError **)error;@end

AlphaInputValidator.m

////  AlphaInputValidator.m//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#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

////  CustomTextField.h//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#import <UIKit/UIKit.h>@class InputValidator;@interface CustomTextField : UITextField@property(nonatomic,strong)InputValidator *inputValidator;-(BOOL)validate;@end

CustomTextField.m

////  CustomTextField.m//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#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

////  ViewController.m//  StrategyDemo////  Created by zhanggui on 15/8/7.//  Copyright (c) 2015年 zhanggui. All rights reserved.//#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

結果:當我們輸入的不滿足條件的時候就會顯示提示信息,而滿足條件就不會有任何提示。

附:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av视频在线播放| 国产在线视频2019最新视频| 亚洲色图13p| 国产精品中文久久久久久久| 国产视频丨精品|在线观看| 国产一区二区激情| 久久久久亚洲精品成人网小说| 欧美色视频日本高清在线观看| 亚洲欧美日韩成人| 欧美日韩精品在线播放| 亚洲欧美在线播放| 91中文精品字幕在线视频| 国产日产亚洲精品| 最近2019年好看中文字幕视频| 欧美极品少妇xxxxⅹ裸体艺术| 性日韩欧美在线视频| 久久亚洲国产精品成人av秋霞| 麻豆乱码国产一区二区三区| 久久精品视频99| 欧美精品在线极品| 成人网欧美在线视频| 6080yy精品一区二区三区| 亚洲欧美在线x视频| 欧美日韩福利在线观看| www.国产一区| 亚洲欧洲在线看| 欧美性xxxxx| 国产精品专区第二| 久久久久久999| 日韩中文字幕免费| 国产成人在线亚洲欧美| 欧美午夜女人视频在线| 亚洲福利视频专区| 国产精品极品美女粉嫩高清在线| 日韩在线欧美在线国产在线| 亚洲国产成人在线播放| 91网站免费看| 久久成人精品一区二区三区| 亚洲中国色老太| 久久久久久久av| 一个人看的www欧美| 欧美片一区二区三区| 亚洲美女又黄又爽在线观看| 中文字幕亚洲欧美日韩高清| 亚洲欧美激情视频| 成人国产精品一区| 国产精品成人久久久久| 国产精品自产拍高潮在线观看| 欧美剧在线观看| 久久av.com| 高跟丝袜一区二区三区| 91久久嫩草影院一区二区| 亚洲美女喷白浆| 国产精品久久久久久五月尺| 中文字幕国产日韩| 欧美成年人网站| 91免费在线视频网站| 色婷婷综合久久久久| 欧美日韩在线观看视频| 久久久噜噜噜久久中文字免| 91在线视频成人| 国产欧美日韩精品丝袜高跟鞋| 亚洲人成网在线播放| 亚洲欧洲在线观看| 亚洲人午夜精品| 中文字幕精品在线| 国产精品一区二区久久久久| 国产一区二区三区久久精品| 性色av一区二区三区| 91亚洲精华国产精华| 日韩高清a**址| 上原亚衣av一区二区三区| 国产精品日日摸夜夜添夜夜av| 九九热99久久久国产盗摄| 国产一区二区三区在线视频| 亚洲一区国产精品| 欧美视频一二三| 欧美色道久久88综合亚洲精品| 久久噜噜噜精品国产亚洲综合| 日韩av影片在线观看| 欧美久久精品午夜青青大伊人| 久久理论片午夜琪琪电影网| xvideos亚洲| 国产一区二区三区直播精品电影| 亚洲精品福利视频| 亚洲aa在线观看| 精品国产视频在线| 久久最新资源网| 欧美日韩国产精品一区| 九色成人免费视频| 国产乱人伦真实精品视频| 成人在线激情视频| 亚洲精品国产品国语在线| 欧美日韩国产精品一区二区不卡中文| 国产欧美日韩最新| 亚洲电影在线观看| 国产精品一区二区在线| 亚洲自拍小视频| 色无极亚洲影院| 欧美精品日韩三级| 一区二区日韩精品| 欧美在线视频在线播放完整版免费观看| 日韩激情av在线播放| 久久好看免费视频| 色综合久久天天综线观看| 亚洲自拍欧美另类| 亚洲激情自拍图| 日韩av片永久免费网站| 在线亚洲午夜片av大片| 国产精品免费看久久久香蕉| 欧美wwwwww| 亚洲欧美中文另类| 中文字幕亚洲二区| 一区二区三区精品99久久| 91网站在线免费观看| 欧美精品一区三区| 成人黄色短视频在线观看| 中文字幕日韩在线观看| 一区二区中文字幕| 国产成人精品免高潮费视频| 欧美视频中文字幕在线| 8090成年在线看片午夜| 欧美成人激情图片网| 韩国欧美亚洲国产| 欧美精品videos另类日本| 午夜免费在线观看精品视频| 欧美日韩亚洲视频| 丁香五六月婷婷久久激情| 欧美wwwwww| 国产玖玖精品视频| 国产亚洲精品久久久久久777| 亚洲精品视频免费| 欧美中文在线观看国产| 久久久久99精品久久久久| 久久久在线观看| 色爱精品视频一区| 国产在线视频一区| 日韩最新中文字幕电影免费看| 精品国产一区二区三区久久狼黑人| 91国产视频在线播放| 国产精品入口日韩视频大尺度| 日韩欧美成人区| 国产精品私拍pans大尺度在线| 久久久国产在线视频| 国产成人午夜视频网址| 国产成人97精品免费看片| 中文字幕欧美日韩| 国产精品久久久久免费a∨| 91精品视频专区| 国产精品视频一区国模私拍| 日韩免费在线免费观看| 色综合久久中文字幕综合网小说| 午夜欧美大片免费观看| 日本一区二区在线免费播放| 国产精品黄视频| 91在线观看免费高清| 日韩电影大全免费观看2023年上| 欧美成人精品影院| 中文字幕日韩精品有码视频| 欧美激情一级二级| 日韩大片免费观看视频播放| 亚洲激情视频在线观看| 亚洲午夜久久久影院| 国产成人jvid在线播放|