iOS 策略模式

策略模式

原文鏈接 : 鏈接
定義一系列的算法, 并且將每一個(gè)算法封裝起來(lái), 算法之間還可以相互替換
可以看下圖來(lái)體會(huì)

圖1.png

demo演示

需求簡(jiǎn)單做一個(gè)只接收字母, 只接收數(shù)字的demo, 驗(yàn)證登錄

如下圖所示:


圖2.png

基本步驟

那么我們可以這樣寫(xiě)--->( 此時(shí)全部在控制器中,并沒(méi)有進(jìn)行抽取 )
定義

@property (weak, nonatomic) IBOutlet UITextField *letterInput;//字母輸入
@property (weak, nonatomic) IBOutlet UITextField *numberInput;//數(shù)字輸入

算法

#pragma mark -驗(yàn)證輸入
- (NSString*)letterInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//從開(kāi)頭到結(jié)尾,有效字符集合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 = @"請(qǐng)重新輸入";
}else{
outLetter = @"輸入正確";
}
return outLetter;
}
- (NSString*)numberInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//從開(kāi)頭到結(jié)尾,有效字符集合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 = @"請(qǐng)重新輸入";
}else{
outLetter = @"輸入正確";
}
return outLetter;
}

代理

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

此時(shí)并沒(méi)有進(jìn)行抽取

策略模式進(jìn)行抽取

圖1.png

首先我們來(lái)根據(jù)上圖的思路來(lái)創(chuàng)建一個(gè)抽象類---InputTextField類

聲明

//策略輸入 YES 通過(guò)
//NO 不通過(guò)
- (BOOL)inputTextField:(UITextField *)textField;
@property (nonatomic,copy)NSString *attributeInputStr;//屬性字符

抽象方法

- (BOOL)inputTextField:(UITextField *)textField{
return NO;
}

場(chǎng)景類---CustomTextField

同樣我們來(lái)聲明一個(gè)BOOL類型驗(yàn)證方法, 并將抽象類導(dǎo)入, 之前屬于一個(gè)聚合的關(guān)系

@property (nonatomic,strong)InputTextField *inputTextField;//抽象策略類
//驗(yàn)證方法
- (BOOL)isOK;

實(shí)現(xiàn)

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

實(shí)現(xiàn)類---LetterInput, ---NumberInput, 這兩個(gè)類全部是繼承于抽象類的

此時(shí)我們開(kāi)始寫(xiě)實(shí)現(xiàn)

- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"字母輸入為空";
return nil;
}
//從開(kāi)頭到結(jié)尾,有效字符集合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 = @"請(qǐng)重新輸入";
}else{
self.attributeInputStr = @"輸入正確";
}
return self.attributeInputStr == nil ? YES : NO;
}
- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"數(shù)字輸入為空";
return nil;
}
//從開(kāi)頭到結(jié)尾,有效字符集合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 = @"請(qǐng)重新輸入";
}else{
self.attributeInputStr = @"輸入正確";
}
return self.attributeInputStr == nil ? YES : NO;
}

控制器中實(shí)現(xiàn)

父類指針指向子類對(duì)象

self.letterInput.inputTextField = [LetterInput new];
self.numberInput.inputTextField = [NumberInput new];

調(diào)用

- (void)textFieldDidEndEditing:(UITextField *)textField{
if ([textField isKindOfClass:[CustomTextField class]]) {
[(CustomTextField *)textField inputTextField];
}
}

總結(jié)

假如說(shuō)我們又多了一個(gè)策略, 只需要再次增加一個(gè)類, 增加一個(gè)算法直接調(diào)用, 這樣的話就在Controller中僅僅創(chuàng)建一個(gè)類就可以了, 對(duì)于后期的代碼維護(hù)是不是方便了許多呢?
好了, 給大家這個(gè)簡(jiǎn)單demo, 當(dāng)然在代碼中也寫(xiě)了注釋, 可以去我的git下載, 歡迎star
下載鏈接 : demo地址
技術(shù)交流q群150731459

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅拦,一起剝皮案震驚了整個(gè)濱河市脚翘,隨后出現(xiàn)的幾起案子骗随,更是在濱河造成了極大的恐慌粱快,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件急侥,死亡現(xiàn)場(chǎng)離奇詭異同眯,居然都是意外死亡调炬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哑了,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赘方,“玉大人,你說(shuō)我怎么就攤上這事弱左≌福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵拆火,是天一觀的道長(zhǎng)跳夭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)们镜,這世上最難降的妖魔是什么币叹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮模狭,結(jié)果婚禮上颈抚,老公的妹妹穿的比我還像新娘。我一直安慰自己嚼鹉,他們只是感情好贩汉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锚赤,像睡著了一般匹舞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴树,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天策菜,我揣著相機(jī)與錄音,去河邊找鬼。 笑死又憨,一個(gè)胖子當(dāng)著我的面吹牛翠霍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蠢莺,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寒匙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了躏将?” 一聲冷哼從身側(cè)響起锄弱,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祸憋,沒(méi)想到半個(gè)月后会宪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚯窥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年掸鹅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦赠。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巍沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荷鼠,到底是詐尸還是另有隱情句携,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布允乐,位于F島的核電站矮嫉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牍疏。R本人自食惡果不足惜敞临,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麸澜。 院中可真熱鬧挺尿,春花似錦、人聲如沸炊邦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馁害。三九已至窄俏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碘菜,已是汗流浹背凹蜈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工限寞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仰坦。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓履植,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悄晃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫霎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對(duì)于銷售部門的人來(lái)講妈橄,這是一個(gè)非常重大庶近、非常復(fù)雜的問(wèn)題,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,096評(píng)論 9 62
  • 1 場(chǎng)景問(wèn)題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià)眷蚓,對(duì)于銷售部門的人來(lái)講鼻种,這是一個(gè)非常重大、非常復(fù)雜的問(wèn)題沙热,對(duì)不同的客戶要...
    4e70992f13e7閱讀 3,091評(píng)論 2 16
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是策略模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 策略模式和模板方法模式的區(qū)別 優(yōu)點(diǎn)和...
    w1992wishes閱讀 862評(píng)論 1 7
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評(píng)論 25 707
  • 遇見(jiàn)是我最喜歡的一個(gè)詞校读。在我的世界里,遇見(jiàn)是一件非常美好的事情祖能。 人生若只如初見(jiàn)歉秫,所有的美好都從遇見(jiàn)開(kāi)始。也許有一...
    屋檐下023閱讀 191評(píng)論 0 0