iOS-設(shè)計(jì)模式

一蛇损、觀察者模式

? ? ? 故名思意就是有一個(gè)對(duì)象在默默的看著目標(biāo)對(duì)象幕与,看它是否變化,如果變換就把變化通知給關(guān)心這個(gè)變化的對(duì)象价淌。在iOS開發(fā)中申眼,我們主要有兩種方式來實(shí)現(xiàn)觀察者模式:notification 和KVO;

? ? 1输钩、通知:notification。notification實(shí)現(xiàn)的是一對(duì)多的信息傳遞仲智,可以有多個(gè)對(duì)象收聽同一個(gè)廣播买乃,收聽廣播的對(duì)象負(fù)責(zé)回收你的廣播訂閱。

//訂閱廣播

NSNotificationCenter? * notificationCenter1 = [NSNotificationCenter? defaultCenter];? ? [notificationCenter addObserver:self? selector:@selector(update:) name:@"subjectMessage"? object:nil ];

//發(fā)生變化發(fā)出通知

[notificationCenter postNotification:subjectMessage];

//回收訂閱

[[NSNotificationCenter defaultCenter] removeObserver:self];

? 2钓辆、KVO剪验,成為鍵值觀察的機(jī)制,對(duì)象可以通過它得到其他對(duì)象特定屬性的變更通知前联,NSKeyValueObserving協(xié)議是基礎(chǔ)功戚。它和通知的區(qū)別在于,KVO是被觀察者直接向觀察者發(fā)出通知似嗤,主要用來綁定特定對(duì)象的屬性啸臀。

[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

//變化后的通知內(nèi)容

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{if([keyPath isEqualToString:@"name"])? ? {NSLog(@"賦值后--%@",self.hero.name);NSLog(@"新的值--%@",change[@"new"]);NSLog(@"以前的值--%@",change[@"old"]);

}

}

[self.hero removeObserver:self forKeyPath:@"name"];//注銷觀察者。

二、delegate模式

? ? ? ?簡(jiǎn)單來說代理模式乘粒,就是把想實(shí)現(xiàn)的行為和對(duì)象分離開豌注,對(duì)象把這些行為委托給其他有能力的對(duì)象,來實(shí)現(xiàn)自己的功能灯萍。前提是轧铁,對(duì)象要把這些希望其他對(duì)象實(shí)現(xiàn)的方法,用@protocal的形式聲明出來旦棉。所有接受委托的的對(duì)象齿风,也要明確的接受這個(gè)協(xié)議才可以。最常見的就是tableView的delegate和dataSource绑洛。這個(gè)太多救斑,掠過細(xì)節(jié)。

三诊笤、MVC模式

? ? ? ?根據(jù)功能把a(bǔ)pp中的類分為Model系谐、View、Controller三個(gè)角色讨跟,這是iOS開發(fā)的經(jīng)典模式纪他;

模型會(huì)把任何數(shù)據(jù)的變更通知控制器,然后控制器更新視圖數(shù)據(jù)晾匠。視圖對(duì)象通知控制器用戶的操作茶袒,控制器要么根據(jù)需要來更新模型,要么檢索任何被請(qǐng)求的數(shù)據(jù)凉馆。

你可能在想為什么不能僅僅使用控制器薪寓,在一個(gè)類中實(shí)現(xiàn)視圖和模型,這樣貌似更加容易澜共?

所有的這些都?xì)w結(jié)于代碼關(guān)注點(diǎn)分離以及復(fù)用向叉。在理想的狀態(tài)下,視圖應(yīng)該和模型完全的分離嗦董。如果視圖不依賴某個(gè)實(shí)際的模型母谎,那么視圖就可以被復(fù)用來展示不同模型的數(shù)據(jù)。

四京革、MVVM模式

五奇唤、單利模式

? ? ? ? 單例設(shè)計(jì)模式確保對(duì)于一個(gè)給定的類只有一個(gè)實(shí)例存在,這個(gè)實(shí)例有一個(gè)全局唯一的訪問點(diǎn)匹摇。它通常采用懶加載的方式在第一次用到實(shí)例的時(shí)候再去創(chuàng)建它咬扇。

? ? ? ? 例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],這是Apple系統(tǒng)給我提供的單例廊勃。我們也可以自己創(chuàng)建單例懈贺,比如視頻播放器、比如賬號(hào)對(duì)象、等等隅居。

? ? ? ?單例的要點(diǎn):1钠至、該類有且只有一個(gè)實(shí)例;2胎源、該類必須能夠自行創(chuàng)建實(shí)例棉钧;3、該類可以向整個(gè)系統(tǒng)提供這個(gè)實(shí)例涕蚤。

? ? ? ?單例的優(yōu)點(diǎn):提供了唯一對(duì)象宪卿,在內(nèi)存中只有一個(gè)對(duì)象節(jié)約資源,提高性能万栅。更靈活的實(shí)例化過程佑钾。

? ? ? ?單例的缺點(diǎn):?jiǎn)卫龥]有抽象層,擴(kuò)展很困難烦粒。單例職責(zé)過重休溶,違背了單一職責(zé)原則。

單例的實(shí)現(xiàn)如下:

@implementation ?Singleton

static Singleton * sharedSingleton =nil;

+ (Singleton *) sharedInstance

{if(sharedSingleton ==nil) {

sharedSingleton=[[Singleton alloc] init];

}

return sharedSingleton;

}

@end

另外有一個(gè)GCD的單例方式:

static Myclass _instance;

方法一:

+(id)shareInstance{

@synchronized(self){

if(_instance == nil)

_instance = [MyClass alloc] init];

}

return _instance;

}

方法二:

+(id)shareInstance{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if(_instance == nil)

_instance = [MyClass alloc] init];

});

return _instance;

}

//重寫allocWithZone,里面實(shí)現(xiàn)跟方法一,方法二一致就行.

+(id)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if(_instance == nil)

_instance = [MyClass alloc] init];

});

return _instance;

} 這個(gè)函數(shù)重寫扰她,否則是錯(cuò)誤的兽掰。請(qǐng)讀者注意。

//保證copy時(shí)相同

-(id)copyWithZone:(NSZone *)zone{

return _instance;

}

單例需要注意的是在ARC和MRC下寫法有所不同

MRC下創(chuàng)建單例步驟一樣徒役,不過要處理一些內(nèi)存管理的函數(shù)

-(id)retain{//計(jì)數(shù)器不用加1

return self ;

}

-(id)autorelease{//不需要孽尽,堆區(qū)對(duì)象才需要

return self;

}

-(oneway void)release{};

-(NSUInteger)retainCount{return UINT_MAX;}

單例的銷毀:

在mrc下

+(void)attemptDealloc{

[_instance release]; //mrc 需要釋放,當(dāng)然你就不能重寫release的方法了.

_instance = nil;

}

必須把static dispatch_once_t onceToken; 這個(gè)拿到函數(shù)體外,成為全局的

+(void)attempDealloc{

onceToken = 0; // 只有置成0,GCD才會(huì)認(rèn)為它從未執(zhí)行過.它默認(rèn)為0.這樣才能保證下次再次調(diào)用shareInstance的時(shí)候,再次創(chuàng)建對(duì)象.

[_instance release];

_instance = nil;

}

六、策略模式 Policy

? ? ? ?一系列的算法,把每一個(gè)算法封裝起來, 并且使它們可相互替換忧勿。本模式使得算法可獨(dú)立于使用它的客戶而變化杉女。

? ? ? ? 我們?cè)隍?yàn)證用戶輸入的表單的時(shí)候,加入包括電話輸入框的驗(yàn)證和郵件輸入框的驗(yàn)證鸳吸,這兩部分的驗(yàn)證算法是不同的熏挎,如果把這個(gè)算法看成一個(gè)函數(shù),他幾乎有相同的輸入?yún)?shù)和返回參數(shù)晌砾。我們可以把這個(gè)相同的函數(shù)可以抽象為基類(InputValidator)的一個(gè)方法(bool validateInput(input,error))坎拐,然后抽象出兩個(gè)具體的策略類:電話驗(yàn)證類(PhoneValidator)和郵件驗(yàn)證類(EmailValidator),他們需要在各自的實(shí)現(xiàn)里面去復(fù)寫父類的驗(yàn)證方法贡羔。為了能夠正常的調(diào)用到驗(yàn)證類的驗(yàn)證方法廉白,我們需要自定義一個(gè)UITextField的子類CustomTextField个初,其中有一個(gè)InputValidator類型的引用和一個(gè)validate方法乖寒,該方法里面調(diào)用InputValidator的驗(yàn)證方法,然后在textFieldDidEndEditing代理方法里面調(diào)用CustomTextField的validate方法院溺,這樣就不用我們?cè)谂袛噍斎胧欠窈戏ǖ臅r(shí)候通過if else去處理每種邏輯楣嘁,而且這樣做方便擴(kuò)展,提高可復(fù)用性

七、工廠模式

就是類方法逐虚,創(chuàng)建對(duì)象更方便一些聋溜。

八、MVVM

? ? ? ? 隨著現(xiàn)在App的功能的增加導(dǎo)致復(fù)雜程度的提高叭爱,我們?cè)赩iew Controller放的東西越來越多撮躁,許多邏輯被放在 View Controller 里。它們中的一些確實(shí)屬于 View Controller买雾,但更多的是所謂的“表示邏輯(presentation logic)”把曼,就是那些將 Model 數(shù)據(jù)轉(zhuǎn)換為 View 可以呈現(xiàn)的東西的事情。

? ? ? MVVM的引進(jìn)漓穿,不是用ViewModel來取代View Controller嗤军,而是把“表示邏輯”從View Controller中抽出來放到ViewModel中,來緩解View Controller的壓力晃危,MVVM 聽起來很復(fù)雜叙赚,但它本質(zhì)上就是一個(gè)精心優(yōu)化的 MVC 架構(gòu),而 MVC 你早已熟悉僚饭。

? ? ? 在 iOS 上使用 MVVM 的動(dòng)機(jī)震叮,對(duì)我來說,無論如何浪慌,就是它能減少 View Controller 的復(fù)雜性并使得表示邏輯更易于測(cè)試冤荆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市权纤,隨后出現(xiàn)的幾起案子钓简,更是在濱河造成了極大的恐慌,老刑警劉巖汹想,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外邓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡古掏,警方通過查閱死者的電腦和手機(jī)损话,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽唾,“玉大人丧枪,你說我怎么就攤上這事∨悠迹” “怎么了拧烦?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钝计。 經(jīng)常有香客問我恋博,道長(zhǎng)齐佳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任债沮,我火速辦了婚禮炼吴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疫衩。我一直安慰自己硅蹦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布闷煤。 她就那樣靜靜地躺著提针,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曹傀。 梳的紋絲不亂的頭發(fā)上辐脖,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音皆愉,去河邊找鬼嗜价。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幕庐,可吹牛的內(nèi)容都是我干的久锥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼异剥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瑟由!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冤寿,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤歹苦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后督怜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殴瘦,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年号杠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚪腋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姨蟋,死狀恐怖屉凯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眼溶,我是刑警寧澤悠砚,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站偷仿,受9級(jí)特大地震影響哩簿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酝静,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一节榜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧别智,春花似錦宗苍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敞恋,卻和暖如春丽啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硬猫。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工补箍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啸蜜。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓坑雅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親衬横。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裹粤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 2015/04/22更新:最新更新到Xcode6.3和Swfit 1.2。 更新日志:這個(gè)教程由Vicent Ng...
    木易林1閱讀 293評(píng)論 0 0
  • 單例 單例使用懶加載方式在第一次實(shí)例時(shí)創(chuàng)建蜂林,如[NSUserDefaults standardUserDefaul...
    獅子_挽歌_閱讀 298評(píng)論 0 1
  • 親愛的兒子好幾天沒給我打電話了遥诉,看樣子你是習(xí)慣了那里的生活,高興了習(xí)慣了就把老媽忘了噪叙。昨晚你打電話來給媽媽...
    五度練字玲閱讀 152評(píng)論 0 2
  • By:本人是作者 一:產(chǎn)品內(nèi)容-專門教你在職場(chǎng)里作死的(頂撞上司毆打面試官那都是常態(tài)) 二:產(chǎn)品方案:通過微信對(duì)話...
    邊走邊停的阿Q閱讀 765評(píng)論 0 2
  • 站在講臺(tái)上上課的老師問我們:“同學(xué)們知道什么叫白馬過隙嗎突那?” 像馬兒飛快地跑過山間的縫隙,形容時(shí)間過得很快构眯! 白馬...
    是蓂莢呀閱讀 236評(píng)論 0 0