iOS策略模式

  • 用處:讓算法和對(duì)象分開來翻擒,使得算法可以獨(dú)立于使用它的客戶而變化。
  • 例子:出行旅游怯疤,我們 可以有幾個(gè)策略可以考慮掠抬,可以騎(對(duì)象)自行車,汽車顽悼,做火車,飛機(jī)。每個(gè)策略都可以得到相同的結(jié)果吐句,但是它們使用了不同的資源。選擇策略的依據(jù)(算法)是費(fèi)用店读,時(shí)間嗦枢,使用工具還有每種方式的方便程度 。
  • 結(jié)構(gòu)


  • 當(dāng)存在以下情況時(shí)使用策略模式(優(yōu)點(diǎn))

許多相關(guān)的類僅僅是行為有異屯断。 “策略”提供了一種用多個(gè)行為中的一個(gè)行為來配置一個(gè)類的方法文虏。即一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
需要使用一個(gè)算法的不同變體殖演。例如氧秘,你可能會(huì)定義一些反映不同的空間 /時(shí)間權(quán)衡的算法。當(dāng)這些變體實(shí)現(xiàn)為一個(gè)算法的類層次時(shí) 趴久,可以使用策略模式丸相。
算法使用客戶不應(yīng)該知道的數(shù)據(jù)”斯鳎可使用策略模式以避免暴露復(fù)雜的灭忠、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
一個(gè)類定義了多種行為 , 并且這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn)座硕。將相關(guān)的條件分支移入它們各自的策略類中以代替這些條件語句弛作。

  • 缺點(diǎn)

1.客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類华匾,就是一個(gè)客戶要選擇一個(gè)合適的策略就必須知道這些策略到底有何不同缆蝉。此時(shí)可能不得不向客戶暴露具體的實(shí)現(xiàn)問題。因此僅當(dāng)這些不同行為變體與客戶相關(guān)的行為時(shí) , 才需要使用策略模式。
2.Strategy和Context之間的通信開銷:無論各個(gè)ConcreteStrategy實(shí)現(xiàn)的算法是簡(jiǎn)單還是復(fù)雜, 它們都共享Strategy定義的接口刊头。因此很可能某些 ConcreteStrategy不會(huì)都用到所有通過這個(gè)接口傳遞給它們的信息黍瞧;簡(jiǎn)單的 ConcreteStrategy可能不使用其中的任何信息!這就意味著有時(shí)Context會(huì)創(chuàng)建和初始化一些永遠(yuǎn)不會(huì)用到的參數(shù)原杂。如果存在這樣問題 , 那么將需要在Strategy和Context之間更進(jìn)行緊密的耦合印颤。
3.策略模式將造成產(chǎn)生很多策略類。

  • iOS 應(yīng)用:做一個(gè)只接收字母, 只接收數(shù)字的輸入框, 驗(yàn)證登錄

當(dāng)xib或者sb中有兩個(gè)或多個(gè)以上輸入框穿肄,假如叫l(wèi)etterInput年局,numberInput;那么勢(shì)必在view咸产,或者控制器會(huì)有如下代碼:

- (void)textFieldDidEndEditing:(UITextField *)textField{
    if(textField == self.letterInput){
        //驗(yàn)證是字母的邏輯等
        
    }else if(textField == self.numberInput){
        //驗(yàn)證是數(shù)字的邏輯等
        
    }
}

那么矢否,出現(xiàn)的問題是,如果輸入框較多時(shí)候邏輯太長(zhǎng)脑溢,還會(huì)有多個(gè)條件語句的形式出現(xiàn)僵朗,不利于擴(kuò)展。

如果使用策略模式:

  • 那么制定一個(gè)策略類InputTextField
// .h文件
@interface InputTextField : NSObject
//策略輸入 驗(yàn)證身份合法
- (BOOL)inputTextField:(UITextField *)textField;
@end

// .m文件
@implementation InputTextField
- (BOOL)inputTextField:(UITextField *)textField{
    return NO;
}
@end
  • Context類:CustomTextField屑彻,繼承UITextField验庙,以后在控制器,在view中通過CustomTextField進(jìn)行交互
// .h文件
#import "InputTextField.h"http://聚合關(guān)系
@interface CustomTextField : UITextField
@property (nonatomic,strong)InputTextField *inputTextField;//抽象策略類
//驗(yàn)證方法
- (BOOL)isOK;
@end

// .m文件
@implementation CustomTextField
- (BOOL)isOK{
   BOOL result = [self.inputTextField inputTextField:self];
    if(!result){
        NSLog(@"輸入不合法");
    }
    return result;
}
@end
  • ConcreteStrategy類:集成策略類
    LetterInput:
@implementation LetterInput
- (BOOL)inputTextField:(UITextField *)textField{
    // 驗(yàn)證LetterInput是否合法
    
}
@end

NumberInput:

@implementation NumberInput
- (BOOL)inputTextField:(UITextField *)textField{
    // 驗(yàn)證NumberInput是否合法
}
@end
  • 調(diào)用:
    輸入框變成CustomTextField
@property (weak, nonatomic) IBOutlet CustomTextField *letterInput;//字母輸入
@property (weak, nonatomic) IBOutlet CustomTextField *numberInput;//數(shù)字輸入

初始化實(shí)際策略類

//初始化
    self.letterInput.inputTextField = [LetterInput new];
    self.numberInput.inputTextField = [NumberInput new];

驗(yàn)證輸入框是否合法

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

由此可看出:
1.省略了條件判斷社牲,各自的邏輯分布到各自的策略中粪薛。
2.擴(kuò)展性,假如以后需要?jiǎng)e的驗(yàn)證搏恤,那么增加策略方法- (BOOL)inputAnotherTextField:(UITextField *)textField;违寿,Context類增加新的判斷- (BOOL)isAnotherOK;,然后在對(duì)應(yīng)的ConcreteStrategy類添加邏輯熟空。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藤巢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痛阻,更是在濱河造成了極大的恐慌菌瘪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阱当,死亡現(xiàn)場(chǎng)離奇詭異俏扩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弊添,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門录淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人油坝,你說我怎么就攤上這事嫉戚∨亳桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵彬檀,是天一觀的道長(zhǎng)帆啃。 經(jīng)常有香客問我,道長(zhǎng)窍帝,這世上最難降的妖魔是什么努潘? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坤学,結(jié)果婚禮上疯坤,老公的妹妹穿的比我還像新娘。我一直安慰自己深浮,他們只是感情好压怠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞苇,像睡著了一般菌瘫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玄柠,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天突梦,我揣著相機(jī)與錄音诫舅,去河邊找鬼羽利。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刊懈,可吹牛的內(nèi)容都是我干的这弧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虚汛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匾浪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卷哩,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蛋辈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后将谊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冷溶,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年尊浓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逞频。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋齿,死狀恐怖苗胀,靈堂內(nèi)的尸體忽然破棺而出襟诸,到底是詐尸還是另有隱情,我是刑警寧澤基协,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布歌亲,位于F島的核電站,受9級(jí)特大地震影響澜驮,放射性物質(zhì)發(fā)生泄漏应结。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一泉唁、第九天 我趴在偏房一處隱蔽的房頂上張望鹅龄。 院中可真熱鬧,春花似錦亭畜、人聲如沸扮休。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玷坠。三九已至,卻和暖如春劲藐,著一層夾襖步出監(jiān)牢的瞬間八堡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工聘芜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兄渺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓汰现,卻偏偏與公主長(zhǎng)得像挂谍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞎饲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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