一 六大設(shè)計(jì)原則
單一職責(zé)原則
一個類只負(fù)責(zé)一項(xiàng)職責(zé)
開閉原則
當(dāng)代碼需要變化時(shí),盡量通過擴(kuò)展行為來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化.(對修改關(guān)閉,對擴(kuò)展開放)
接口隔離原則
盡量使用多個專門的協(xié)議而不是將全部的協(xié)議內(nèi)容放置一起(如UITableView的協(xié)議就分為UITableViewDelegate以及UITableViewDataSource)
依賴倒置原則
高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。
類A直接依賴類B,如果要將類A改為依賴類C,則必須通過修改類A的代碼來達(dá)成。此時(shí),類A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯,類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;修改A會給程序帶來風(fēng)險(xiǎn)。
將類A修改未依賴接口I,類B和類C各自實(shí)現(xiàn)接口I,類A通過接口I間接與類B或類C發(fā)生聯(lián)系,則會大大降低修改類A的記幾率
里氏替換原則
使用繼承時(shí),在子類中盡量不要重寫和重載父類的方法。父類中凡是已經(jīng)實(shí)現(xiàn)好的方法(相對抽象方法而言),實(shí)際上是在設(shè)定一系列的規(guī)范和契約,雖然它不強(qiáng)制要求所有的子類必須遵循這些契約,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。(iOS中KVO的設(shè)計(jì)就遵循了該原則)
迪米特法則
本質(zhì)上就是高內(nèi)聚低耦合,每個類都要減少不必要的依賴
二 常用設(shè)計(jì)模式
單例模式
為什么要實(shí)現(xiàn)單例模式
單例模式主要是為了避免因?yàn)閯?chuàng)建了多個實(shí)例造成資源的浪費(fèi),且多個實(shí)例由于多次調(diào)用容易導(dǎo)致結(jié)果出現(xiàn)錯誤,而使用單例模式能夠保證整個應(yīng)用中有且只有一個實(shí)例。
單例模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 1.節(jié)約系統(tǒng)資源,提高系統(tǒng)性能 2.使用方便
缺點(diǎn): 1.使用懶單例模式時(shí)線程有安全的問題 2.單例過多會造成內(nèi)存空間的浪費(fèi) 3.單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則” 4.單例是全局可變的共享狀態(tài),容易造成錯誤 5.單例的生命周期很難管控
單例模式代碼的兩種寫法(確保singleInstance在多線程的環(huán)境下只被創(chuàng)建一次)
+ (instancetype)shared {
static LaunchIntroductionView *singleInstance = nil;
if (singleInstance == nil) {
@synchronized(self) {
if (singleInstance == nil) {
singleInstance = [[LaunchIntroductionView alloc] init];
}
}
}
return singleInstance;
}
+ (instancetype)shared {
static LaunchIntroductionView *launch = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
launch = [[LaunchIntroductionView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height)];
});
return launch;
}
觀察者模式
簡單的說就是一個對象擁有多個特征,當(dāng)某一個特征發(fā)生變化時(shí),另外一個對象做出相應(yīng)的處理和操作.后者觀察前者的一舉一動,并及時(shí)對一些變化做出響應(yīng) (在iOS中KVO/通知均屬于觀察者模式)
具體相關(guān)內(nèi)容的參考詳解
代理模式
代理模式的意思就是委托別人去做事情
具體相關(guān)內(nèi)容的參考詳解
抽象工廠模式/工廠模式/簡單工廠模式
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個相關(guān)對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。(有一個基礎(chǔ)基類根據(jù)不同的Type產(chǎn)生不同的類)
無論是NSArray還是NSMutableArray在alloc階段生成的都是__NSPlacehodlerArray,__NSPlacehodlerArray根據(jù)是否是可變對象生成__NSArrayI還是__NSArrayM.
具體相關(guān)內(nèi)容的參考詳解
責(zé)任鏈模式
用來處理相關(guān)事務(wù)責(zé)任的一條執(zhí)行鏈,執(zhí)行鏈上有多個節(jié)點(diǎn),每個節(jié)點(diǎn)都有機(jī)會(條件匹配)處理請求事務(wù),如果某個節(jié)點(diǎn)處理完了就可以根據(jù)實(shí)際業(yè)務(wù)需求傳遞給下一個節(jié)點(diǎn)繼續(xù)處理或者返回處理完畢
橋接模式
本質(zhì)是將抽象部分與實(shí)現(xiàn)部分分離開來,使他們都可以獨(dú)立變化.
橋接模式主要包含如下幾個角色:
Abstraction:抽象類。
RefinedAbstraction:擴(kuò)充抽象類。
Implementor:實(shí)現(xiàn)類接口。
ConcreteImplementor:具體實(shí)現(xiàn)類 。
適配器模式
一個現(xiàn)有類需要使用變化的問題(有對象適配器和類適配器兩種),將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作.