小白程序員只能看懂源代碼瞬捕,而大神程序員能看懂文檔。
設(shè)計(jì)模式:為解決特定場景的問題而定制的解決方案。
設(shè)計(jì)原則:構(gòu)建可復(fù)制可維護(hù)代碼的經(jīng)驗(yàn)法則娃豹。
MVC是復(fù)合設(shè)計(jì)模式(不是基本設(shè)計(jì)模式,屬于架構(gòu)級的設(shè)計(jì)模式)购裙。
- Model上的Notification和KVO是觀察者模式。
- Controller和View之間的target-action是命令模式鹃栽。
- delegate是代理模式其實(shí)是適配器模式躏率。
- View將接收到動作給Controller,Controller使Model做不同的操作民鼓,取決于控制器的內(nèi)置策略薇芝,是策略模式。
- 控制器構(gòu)成了Model和View之間傳遞數(shù)據(jù)的雙向通道丰嘉,是中介者模式夯到。
- 適配器模式
- 策略模式
- 觀察者模式
- 原型模式/外觀模式
- 裝飾模式
- 工廠模式
- 橋接模式
- 代理模式
- 單例模式
- 備忘錄模式
- 生成器模式
- 命令模式
- 組合模式
編碼是門藝術(shù)
設(shè)計(jì)30層樓棟項(xiàng)目,設(shè)計(jì)一開始就有完善的設(shè)計(jì)稿饮亏,材料耍贾,論證抗震指數(shù)。
設(shè)計(jì)模式就像是設(shè)計(jì)高樓的設(shè)計(jì)稿路幸,是用以解決實(shí)際問題的荐开。
設(shè)計(jì)模式是抽象出來的理論,但用來解決的實(shí)際問題简肴,一點(diǎn)也不抽象晃听。
設(shè)計(jì)模式是為復(fù)雜的項(xiàng)目而設(shè)計(jì)的,大部分用于非常復(fù)雜的項(xiàng)目砰识,簡化項(xiàng)目設(shè)計(jì)能扒,讓設(shè)計(jì)與實(shí)現(xiàn)成為可能。
為何會抽象出設(shè)計(jì)模式
幾十人做的項(xiàng)目辫狼,就要按圖紙初斑,按固定、有效率的方式實(shí)現(xiàn)細(xì)節(jié)予借。
設(shè)計(jì)模式是之前開發(fā)人員在開發(fā)大型項(xiàng)目遇到的問題越平,抽象出來的解決方案,是為解決特定問題而存在的灵迫。設(shè)計(jì)模式可以解決什么問題
遇到復(fù)雜項(xiàng)目秦叛,用以解決特定存在的問題。
適配器模式瀑粥,專門用來解決接口適配問題挣跋,model與view綁定的設(shè)計(jì)不好,model修改繼而修改view狞换,而適配器模式是model與view產(chǎn)生隔離避咆,分別只會與適配器接觸舟肉,達(dá)到解耦的效果。-
學(xué)習(xí)設(shè)計(jì)模式的必要性
- 務(wù)必先理解透徹
- 面向?qū)ο笳Z言的3種特性查库,封裝路媚、繼承、多態(tài)
- 設(shè)計(jì)模式基本原則樊销,開閉原則整慎、里氏代換原則、依賴倒轉(zhuǎn)原則围苫、接口隔離原則裤园,合成/聚合復(fù)用
- 務(wù)必先理解透徹
-
推薦兩本書
- 《Pro Design Patterns in Swift》
- 《Pro Objective-C Design Patterns for iOS》
現(xiàn)實(shí)開發(fā)中遇到的特定問題,才用設(shè)計(jì)模式來優(yōu)化這種設(shè)計(jì)剂府。
設(shè)計(jì)模式基本原則
- 開閉原則
模塊開發(fā)拧揽,對擴(kuò)展開放,對修改關(guān)閉腺占。 - 里氏代換原則
子類父類相互替換淤袜,類似抽象父類調(diào)用子類方法 - 依賴倒轉(zhuǎn)原則
抽象不依賴細(xì)節(jié),細(xì)節(jié)依賴抽象湾笛,用于設(shè)計(jì)接口饮怯,不破壞封裝性,類似抽象方法不暴露實(shí)現(xiàn)細(xì)節(jié)嚎研,實(shí)現(xiàn)細(xì)節(jié)方法依賴抽象方法 -
接口隔離原則
接口做必要的事情蓖墅,不做沒有相關(guān)性的事,如果開發(fā)嚴(yán)格遵守接口隔離原則临扮,會讓源碼復(fù)用性很高论矾。 - 合成/聚合復(fù)用
設(shè)計(jì)模式的類型
-
設(shè)計(jì)模式的類型
- GoF
- 并發(fā)設(shè)計(jì)模式
- 框架級別的設(shè)計(jì)模式
-
設(shè)計(jì)模式的劃分
設(shè)計(jì)模式的類型.png
- GoF patterns(23種GoF設(shè)計(jì)模式)
(Creational)
- Abstract factory(抽象工廠模式)
- Builder(生成器模式)
- ** Factory method(工廠模式)**
- Prototype(原型模式)
-
Singleton(單例模式)
(Structural ) - Adapter(適配器模式)
- Bridge(橋接模式)
- Composite(組合模式)
- Decorator(裝飾模式)
- Facade(外觀模式)
- Flyweight(享元模式)
-
Proxy(代理模式)
(Behavioral) - Chain of responsibility(責(zé)任鏈模式)
- Interpreter(解析器模式)
- Iterator(迭代器模式)
- Mediator(中介者模式)
- Memento(備忘錄模式)
- Observer(觀察者模)
- State(狀態(tài)模式)
- Strategy(策略模式)
- Template method(模板方法模式)
- Visitor(訪問者模式)
- Concurrency patterns(并發(fā)模型)
- Active object(主動對象模式)
- Balking(止步模式)
- Double-checked locking(雙重檢查鎖定)
- Event-based asynchronous(基于事件的異步鎖模式)
- Guarded suspension(保護(hù)暫停模式)
- Join(加盟模式)
- Lock(加鎖模式)
- Monitor(監(jiān)視器)
- Proactor(Proactor模式)
- Reactor(Reactor模式)
- Read write lock(讀寫鎖)
- Scheduler(調(diào)度)
- Thread pool(線程池模式)
- Thread-local storage(線程本地存儲TLS)
- Architectural patterns
- Front controller(前端控制器模式)
- intercepter(攔截器模式)
- MVC(模型-視圖-控制器模式,MVC模式)
- n-tier(多層架構(gòu)模式)
- Specification(規(guī)格模式)
- Publish-subscribe(訂閱發(fā)布模式)
- Naked objects(Naked objects模式)
- Service locator(服務(wù)定位器模式)
- Active record(活躍記錄模式)
- Identity map(恒等映射模式)
- Data access object(數(shù)據(jù)訪問對象模式杆勇,DAO模式)
- Data transfer object(數(shù)據(jù)傳輸對象模式贪壳,DTO模式)
- Other patterns
Dependency injection(依賴性注射模式)
lazy loading(懶加載模式)
Mock object(模擬對象)
Null object(空對象模式)
Object pool(對象池模式)
Servant(仆人模式)
Type tunnel(隧道模式)
功能劃分
對象創(chuàng)建
接口適配,設(shè)計(jì)模式
對象去耦蚜退,觀察者
抽象集合闰靴,組合模式
行為擴(kuò)展,訪問者
算法封裝钻注,策略模式
對象訪問蚂且,代理模式
對象狀態(tài),備忘錄幅恋,用于回退操作杏死,并保存每一步修改狀態(tài)
-
推薦3個鏈接
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)。
適配器模式
-
何為適配器模式
- 國家電壓頻率不一致問題
- 充電器如何解決電壓頻率轉(zhuǎn)換問題
- 充電器于適配器之間的關(guān)聯(lián)
-
數(shù)據(jù)直接適配帶來的困境
- 直接賦值的靈活性問題
- 如何降低數(shù)據(jù)層和視圖層的耦合度
-
使用適配器模式
創(chuàng)建適配協(xié)議淑翼,創(chuàng)建抽象適配器類腐巢,創(chuàng)建類適配器/對象適配器。- 創(chuàng)建抽象適配器對象
- 適配器與視圖層建立輸出的聯(lián)系
- 適配器與數(shù)據(jù)層建立輸入的聯(lián)系
- 類適配器與對象適配器
-
適配器模式的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
復(fù)用性更高玄括,可移植性更強(qiáng)冯丙。- 降低視圖層和數(shù)據(jù)層的耦合度
- 通用性、好維護(hù)遭京,不需要修改核心代碼银还,只需要創(chuàng)建適配器類,或?qū)崿F(xiàn)類適配器
- 缺點(diǎn)
- 實(shí)現(xiàn)操作多洁墙,可讀性有局限性,必須深刻理解
- 優(yōu)點(diǎn)
review以前的代碼戒财,進(jìn)行適當(dāng)?shù)母倪M(jìn)热监。
策略模式
-
if -else的問題
- 如果判斷邏輯都使用if-else
- 將if-else判斷邏輯抽象為對象
- 策略(整體)作為對象
-
策略模式的原理
- 策略模式的原理<靜態(tài)關(guān)系>
- 策略類
- 策略接口
- 具體策略類
- 場景類
- 相同的輸入不同的輸出
- 策略模式的原理<靜態(tài)關(guān)系>
-
策略模式的使用
- 如何抽象出策略
- 制定協(xié)議來維護(hù)輸出信息
-
策略模式的優(yōu)缺點(diǎn)
- 策略模式的優(yōu)點(diǎn)
- 簡化if-else操作
- 可維護(hù)很高,策略基類饮寞,實(shí)例化一個子類孝扛,按固定協(xié)議的抽象出的方案來判斷
- 策略模式的缺點(diǎn)
- 驗(yàn)證號碼是在實(shí)例化前就確定的策略,無法動態(tài)化
- 策略模式的優(yōu)點(diǎn)
review以前的代碼幽崩,進(jìn)行適當(dāng)?shù)母倪M(jìn)苦始。
觀察者模式
-
如何訂閱一本雜志
- 如何訂閱一本雜志
- 訂閱雜志過程角色功能的定義
- 對功能模型進(jìn)行抽象
-
通知中心的抽象設(shè)計(jì)
- 如何抽象接口
- 對訂閱對象抽象
- 面向接口編程
-
實(shí)現(xiàn)通知中心
- 對象持有的問題
- 用NSHashTable實(shí)現(xiàn)weak引用
- 參數(shù)嚴(yán)格驗(yàn)證
-
KVO與通知中心
- KVO與通知中心的使用
- KVO與通知中心需要注意的細(xì)節(jié)
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)慌申。
原型模式/外觀模式
-
模板的用處
- 為何需要制作模板
具有共通的特性陌选,只需要修改元素,就可獲取不同對象蹄溉。 - 何時需要制作模板
對象之間十分相似咨油,抽象部分完全相同,只有細(xì)節(jié)略有差異柒爵。
- 為何需要制作模板
-
原型模式的原理
- 原型模式的基本原理
對象支持拷貝自己 - 何時使用原型模式
復(fù)制自己役电,適用對象組合起來特別復(fù)雜,重新創(chuàng)建代價特別大時棉胀,用原型模式可以直接從模板拷貝出來通過修改幾個值達(dá)到需求時法瑟。
- 原型模式的基本原理
-
NSCopying協(xié)議的使用細(xì)節(jié)
- NSCopying協(xié)議的使用
- 深拷貝與淺拷貝
- 不支持NSCopying協(xié)議的對象
-
如何去一個指定的地方
- 自駕 or 坐火車
- 用不同的手段達(dá)到相同的目的
-
外觀模式的原理
外觀模式的基本原理
解耦合
簡化來操作
-
何時使用外觀模式
- 復(fù)雜的子系統(tǒng)
- 不關(guān)心邏輯,只要結(jié)果
需要注意的細(xì)節(jié)
-
如何繪制復(fù)雜的圖形
- 為何要簡化操作邏輯
- 用外觀模式簡化流程
- 可維護(hù)性探討
review以前的代碼唁奢,進(jìn)行適當(dāng)?shù)母倪M(jìn)霎挟。
裝飾模式
-
照片與相框
- 增加照片的美感
- 相框的適用范圍
- 照片的復(fù)用性
-
裝飾模式的原理
- 裝飾模式的基本原理(UML)
- 不改變原始類,不知道原始類具體實(shí)現(xiàn)驮瞧,動態(tài)擴(kuò)展功能
- 不改變使用繼承的情形氓扛,不想有更多子類不想通過繼承的方式添加功能
- 動態(tài)擴(kuò)展對象的功能
- 持有對象的引用,包含實(shí)例化的被裝飾類
- 裝飾模式的基本原理(UML)
裝飾模式的優(yōu)點(diǎn)
不改變、不繼承采郎、動態(tài)擴(kuò)展功能-
裝飾模式的使用場景
- 靜態(tài)庫需要擴(kuò)展功能千所,卻無法修改實(shí)現(xiàn)
-
實(shí)現(xiàn)裝飾模式
- 如何增加新的按鈕
- 裝飾模式的實(shí)現(xiàn)
-
category 的使用
- category 與裝飾模式的細(xì)微區(qū)別
- 給 category 添加屬性,重寫被裝飾對象方法
- 使用 category 需要注意的一些地方
review以前的代碼蒜埋,進(jìn)行適當(dāng)?shù)母倪M(jìn)淫痰。
工廠模式
-
制造手機(jī)與使用手機(jī)
- 制造手機(jī)的過程
- 使用手機(jī)的行為
- 何為工廠方法
-
簡單工廠
- 簡單工廠原理
- 為何叫簡單工廠
- 簡單工廠使用場景
- 簡化生產(chǎn)流程
- 隔離生產(chǎn)產(chǎn)品的細(xì)節(jié)
- 不同類型的產(chǎn)品之間有著一些共同的細(xì)節(jié)
- 具體工廠
-
抽象工廠
- 抽象工廠原理
- 抽象工廠抽象在哪里
- 抽象工廠使用場景
-
Cocoa 框架中的 NSNumber
- NSNumber 的抽象行為
- NSNumber 與工廠方法的比較
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)整份。
橋接模式
-
遙控器與電視機(jī)
- 遙控器遙控電視機(jī)的過程
- 遙控器與電視機(jī)職能的分解
- 建立抽象層次結(jié)構(gòu)
-
橋接模式原理
橋接模式的目的待错,就是把抽象層次結(jié)構(gòu)從具體的實(shí)現(xiàn)中分離出來,使其能夠獨(dú)立變更烈评。抽象層次定義了供客戶端使用的上層抽象接口火俄。實(shí)現(xiàn)結(jié)構(gòu)定義了供抽象層使用的底層接口。實(shí)現(xiàn)類的引用被封裝到抽象層的實(shí)例中讲冠,橋接就形成了瓜客。- 上層抽象接口的職能
- 實(shí)現(xiàn)層抽象接口的職能
- 層級間的通信協(xié)議
- 橋接模式的原理
-
設(shè)計(jì)游戲機(jī)模擬器
- 游戲機(jī)模擬器的功能定義
- 按鈕協(xié)議的制定
- 游戲機(jī)模擬器的實(shí)現(xiàn)
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)竿开。
代理模式
review以前的代碼谱仪,進(jìn)行適當(dāng)?shù)母倪M(jìn)。
單例模式
review以前的代碼否彩,進(jìn)行適當(dāng)?shù)母倪M(jìn)疯攒。
備忘錄模式
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)列荔。
生成器模式
review以前的代碼敬尺,進(jìn)行適當(dāng)?shù)母倪M(jìn)。
命令模式
review以前的代碼贴浙,進(jìn)行適當(dāng)?shù)母倪M(jìn)筷转。
組合模式
review以前的代碼,進(jìn)行適當(dāng)?shù)母倪M(jìn)悬而。