小白程序員只能看懂源代碼,而大神程序員能看懂文檔。
設計模式:為解決特定場景的問題而定制的解決方案。
設計原則:構(gòu)建可復制可維護代碼的經(jīng)驗法則。
MVC是復合設計模式(不是基本設計模式,屬于架構(gòu)級的設計模式)。
- Model上的Notification和KVO是觀察者模式。
- Controller和View之間的target-action是命令模式。
- delegate是代理模式其實是適配器模式。
- View將接收到動作給Controller,Controller使Model做不同的操作,取決于控制器的內(nèi)置策略,是策略模式。
- 控制器構(gòu)成了Model和View之間傳遞數(shù)據(jù)的雙向通道,是中介者模式。
- 適配器模式
- 策略模式
- 觀察者模式
- 原型模式/外觀模式
- 裝飾模式
- 工廠模式
- 橋接模式
- 代理模式
- 單例模式
- 備忘錄模式
- 生成器模式
- 命令模式
- 組合模式
編碼是門藝術
設計30層樓棟項目,設計一開始就有完善的設計稿,材料,論證抗震指數(shù)。
設計模式就像是設計高樓的設計稿,是用以解決實際問題的。
設計模式是抽象出來的理論,但用來解決的實際問題,一點也不抽象。
設計模式是為復雜的項目而設計的,大部分用于非常復雜的項目,簡化項目設計,讓設計與實現(xiàn)成為可能。
為何會抽象出設計模式
幾十人做的項目,就要按圖紙,按固定、有效率的方式實現(xiàn)細節(jié)。
設計模式是之前開發(fā)人員在開發(fā)大型項目遇到的問題,抽象出來的解決方案,是為解決特定問題而存在的。設計模式可以解決什么問題
遇到復雜項目,用以解決特定存在的問題。
適配器模式,專門用來解決接口適配問題,model與view綁定的設計不好,model修改繼而修改view,而適配器模式是model與view產(chǎn)生隔離,分別只會與適配器接觸,達到解耦的效果。-
學習設計模式的必要性
- 務必先理解透徹
- 面向?qū)ο笳Z言的3種特性,封裝、繼承、多態(tài)
- 設計模式基本原則,開閉原則、里氏代換原則、依賴倒轉(zhuǎn)原則、接口隔離原則,合成/聚合復用
- 務必先理解透徹
-
推薦兩本書
- 《Pro Design Patterns in Swift》
- 《Pro Objective-C Design Patterns for iOS》
現(xiàn)實開發(fā)中遇到的特定問題,才用設計模式來優(yōu)化這種設計。
設計模式基本原則
- 開閉原則
模塊開發(fā),對擴展開放,對修改關閉。 - 里氏代換原則
子類父類相互替換,類似抽象父類調(diào)用子類方法 - 依賴倒轉(zhuǎn)原則
抽象不依賴細節(jié),細節(jié)依賴抽象,用于設計接口,不破壞封裝性,類似抽象方法不暴露實現(xiàn)細節(jié),實現(xiàn)細節(jié)方法依賴抽象方法 -
接口隔離原則
接口做必要的事情,不做沒有相關性的事,如果開發(fā)嚴格遵守接口隔離原則,會讓源碼復用性很高。 - 合成/聚合復用
設計模式的類型
-
設計模式的類型
- GoF
- 并發(fā)設計模式
- 框架級別的設計模式
-
設計模式的劃分
設計模式的類型.png
- GoF patterns(23種GoF設計模式)
(Creational)
- Abstract factory(抽象工廠模式)
- Builder(生成器模式)
- ** Factory method(工廠模式)**
- Prototype(原型模式)
-
Singleton(單例模式)
(Structural ) - Adapter(適配器模式)
- Bridge(橋接模式)
- Composite(組合模式)
- Decorator(裝飾模式)
- Facade(外觀模式)
- Flyweight(享元模式)
-
Proxy(代理模式)
(Behavioral) - Chain of responsibility(責任鏈模式)
- 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(保護暫停模式)
- 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(服務定位器模式)
- 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)建
接口適配,設計模式
對象去耦,觀察者
抽象集合,組合模式
行為擴展,訪問者
算法封裝,策略模式
對象訪問,代理模式
對象狀態(tài),備忘錄,用于回退操作,并保存每一步修改狀態(tài)
-
推薦3個鏈接
review以前的代碼,進行適當?shù)母倪M。
適配器模式
-
何為適配器模式
- 國家電壓頻率不一致問題
- 充電器如何解決電壓頻率轉(zhuǎn)換問題
- 充電器于適配器之間的關聯(lián)
-
數(shù)據(jù)直接適配帶來的困境
- 直接賦值的靈活性問題
- 如何降低數(shù)據(jù)層和視圖層的耦合度
-
使用適配器模式
創(chuàng)建適配協(xié)議,創(chuàng)建抽象適配器類,創(chuàng)建類適配器/對象適配器。- 創(chuàng)建抽象適配器對象
- 適配器與視圖層建立輸出的聯(lián)系
- 適配器與數(shù)據(jù)層建立輸入的聯(lián)系
- 類適配器與對象適配器
-
適配器模式的優(yōu)缺點
- 優(yōu)點
復用性更高,可移植性更強。- 降低視圖層和數(shù)據(jù)層的耦合度
- 通用性、好維護,不需要修改核心代碼,只需要創(chuàng)建適配器類,或?qū)崿F(xiàn)類適配器
- 缺點
- 實現(xiàn)操作多,可讀性有局限性,必須深刻理解
- 優(yōu)點
review以前的代碼,進行適當?shù)母倪M。
策略模式
-
if -else的問題
- 如果判斷邏輯都使用if-else
- 將if-else判斷邏輯抽象為對象
- 策略(整體)作為對象
-
策略模式的原理
- 策略模式的原理<靜態(tài)關系>
- 策略類
- 策略接口
- 具體策略類
- 場景類
- 相同的輸入不同的輸出
- 策略模式的原理<靜態(tài)關系>
-
策略模式的使用
- 如何抽象出策略
- 制定協(xié)議來維護輸出信息
-
策略模式的優(yōu)缺點
- 策略模式的優(yōu)點
- 簡化if-else操作
- 可維護很高,策略基類,實例化一個子類,按固定協(xié)議的抽象出的方案來判斷
- 策略模式的缺點
- 驗證號碼是在實例化前就確定的策略,無法動態(tài)化
- 策略模式的優(yōu)點
review以前的代碼,進行適當?shù)母倪M。
觀察者模式
-
如何訂閱一本雜志
- 如何訂閱一本雜志
- 訂閱雜志過程角色功能的定義
- 對功能模型進行抽象
-
通知中心的抽象設計
- 如何抽象接口
- 對訂閱對象抽象
- 面向接口編程
-
實現(xiàn)通知中心
- 對象持有的問題
- 用NSHashTable實現(xiàn)weak引用
- 參數(shù)嚴格驗證
-
KVO與通知中心
- KVO與通知中心的使用
- KVO與通知中心需要注意的細節(jié)
review以前的代碼,進行適當?shù)母倪M。
原型模式/外觀模式
-
模板的用處
- 為何需要制作模板
具有共通的特性,只需要修改元素,就可獲取不同對象。 - 何時需要制作模板
對象之間十分相似,抽象部分完全相同,只有細節(jié)略有差異。
- 為何需要制作模板
-
原型模式的原理
- 原型模式的基本原理
對象支持拷貝自己 - 何時使用原型模式
復制自己,適用對象組合起來特別復雜,重新創(chuàng)建代價特別大時,用原型模式可以直接從模板拷貝出來通過修改幾個值達到需求時。
- 原型模式的基本原理
-
NSCopying協(xié)議的使用細節(jié)
- NSCopying協(xié)議的使用
- 深拷貝與淺拷貝
- 不支持NSCopying協(xié)議的對象
-
如何去一個指定的地方
- 自駕 or 坐火車
- 用不同的手段達到相同的目的
-
外觀模式的原理
外觀模式的基本原理
解耦合
簡化來操作
-
何時使用外觀模式
- 復雜的子系統(tǒng)
- 不關心邏輯,只要結(jié)果
需要注意的細節(jié)
-
如何繪制復雜的圖形
- 為何要簡化操作邏輯
- 用外觀模式簡化流程
- 可維護性探討
review以前的代碼,進行適當?shù)母倪M。
裝飾模式
-
照片與相框
- 增加照片的美感
- 相框的適用范圍
- 照片的復用性
-
裝飾模式的原理
- 裝飾模式的基本原理(UML)
- 不改變原始類,不知道原始類具體實現(xiàn),動態(tài)擴展功能
- 不改變使用繼承的情形,不想有更多子類不想通過繼承的方式添加功能
- 動態(tài)擴展對象的功能
- 持有對象的引用,包含實例化的被裝飾類
- 裝飾模式的基本原理(UML)
裝飾模式的優(yōu)點
不改變、不繼承、動態(tài)擴展功能-
裝飾模式的使用場景
- 靜態(tài)庫需要擴展功能,卻無法修改實現(xiàn)
-
實現(xiàn)裝飾模式
- 如何增加新的按鈕
- 裝飾模式的實現(xiàn)
-
category 的使用
- category 與裝飾模式的細微區(qū)別
- 給 category 添加屬性,重寫被裝飾對象方法
- 使用 category 需要注意的一些地方
review以前的代碼,進行適當?shù)母倪M。
工廠模式
-
制造手機與使用手機
- 制造手機的過程
- 使用手機的行為
- 何為工廠方法
-
簡單工廠
- 簡單工廠原理
- 為何叫簡單工廠
- 簡單工廠使用場景
- 簡化生產(chǎn)流程
- 隔離生產(chǎn)產(chǎn)品的細節(jié)
- 不同類型的產(chǎn)品之間有著一些共同的細節(jié)
- 具體工廠
-
抽象工廠
- 抽象工廠原理
- 抽象工廠抽象在哪里
- 抽象工廠使用場景
-
Cocoa 框架中的 NSNumber
- NSNumber 的抽象行為
- NSNumber 與工廠方法的比較
review以前的代碼,進行適當?shù)母倪M。
橋接模式
-
遙控器與電視機
- 遙控器遙控電視機的過程
- 遙控器與電視機職能的分解
- 建立抽象層次結(jié)構(gòu)
-
橋接模式原理
橋接模式的目的,就是把抽象層次結(jié)構(gòu)從具體的實現(xiàn)中分離出來,使其能夠獨立變更。抽象層次定義了供客戶端使用的上層抽象接口。實現(xiàn)結(jié)構(gòu)定義了供抽象層使用的底層接口。實現(xiàn)類的引用被封裝到抽象層的實例中,橋接就形成了。- 上層抽象接口的職能
- 實現(xiàn)層抽象接口的職能
- 層級間的通信協(xié)議
- 橋接模式的原理
-
設計游戲機模擬器
- 游戲機模擬器的功能定義
- 按鈕協(xié)議的制定
- 游戲機模擬器的實現(xiàn)
review以前的代碼,進行適當?shù)母倪M。
代理模式
review以前的代碼,進行適當?shù)母倪M。
單例模式
review以前的代碼,進行適當?shù)母倪M。
備忘錄模式
review以前的代碼,進行適當?shù)母倪M。
生成器模式
review以前的代碼,進行適當?shù)母倪M。
命令模式
review以前的代碼,進行適當?shù)母倪M。
組合模式
review以前的代碼,進行適當?shù)母倪M。