《Object-C編程之道》我的感受是很是好的一本iOS設計模式書籍。
裏面會結合在iOS的Cocoa 框架中使用到的例子進行講解,在學習設計模式的同時,也能對Cocoa框架中使用的設計模式有個熟悉。這一點我很是喜歡。
按照設計模式的功能進行劃分,能夠分爲八類:
接口適配類,對象去耦類,對象建立類,抽象集合類,對象狀態類,行爲擴展類,算法封裝類,性能與對象訪問類。其中包含內容以下:
對象建立型:1.原型模式;2.工廠模式;3.抽象工廠模式;4.單例模式;5.生成器
接口適配型:1.適配器模式;2.橋接模式;3.外觀模式
對象去耦型:1.中介者模式;2.觀察者模式
抽象集合型:1.組合模式;2.迭代器模式
行爲擴展型:1.訪問者模式;2.裝飾器模式;3.責任鏈模式
算法封裝型:1.模版方法模式;2.策略模式;3.命令模式
性能與對象訪問型:1.享元模式;2.代理模式
對象狀態型:1.備忘錄模式
下面將對書中講解到的設計模式進行簡述。
建議有時間的同窗去通讀和練習一遍。沒有時間的同窗就看我下面寫的吧,先作到內心有個概況。等有時間了再去研究。
後面計劃對裏面的每種設計模式進行詳解(二十一種,真很多),想持續關注的要留心了。
對象建立型
原型模式:
簡單的說就是複製,用同一個磨具複製出一系列的東西。
使用場景有:
1.建立一個實例流暢複雜,複製比較容易;
2.建立一個對象子對象組合比較多,複製比較容易;
應用實例:
自定義對象實現NSCopy協議或者NSMutableCopy協議,實現方法copyWithZone或者mutableCopyWithZone。就是對此設計模式的體現。
工廠模式:
簡單的說就是在一個類中根據需求,能夠生產出多種類型的產品。
使用場景有:
類有不少具體的子類,想讓返回什麼樣的子類局部化,由內部自行判斷。
應用實例:
NSNumber類定義了一系列的工廠方法:
根據int 生產 intNumber; 根據unsigned int 生產 unsignedNumber;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
抽象工廠模式:
從產品的角度看,是一種二維的思考。如水果工廠的工廠模式是生產蘋果,橘子。
而蘋果分爲北方工廠產的蘋果,南方工廠產的蘋果。
從工廠的角度看,比較簡單。抽象工廠下面兩個子工廠,它們均可以生產蘋果,橘子。
應用實例:
NSNumber抽象工廠。下面不少具體的number工廠,如:
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
單例模式:
一個類只有一個實例,並提供全局訪問點。
使用場景有:
系統只能共享,沒法複製的元素。
應用實例:
文件系統管理類:整個系統只有一份。
UIApplication:一個App只有一個應用單例。
生成器模式:
將一個複雜對象的構建與它的表現分離,使得一樣的構建過程能夠建立不同的表現對象。
使用場景:
構建過程須要用不一樣的組合構建不一樣表現的對象。
對於生成一個比較複雜的對象,一般使用生成器模式 裏面按照角色劃分有4種:
客戶端,提出一系列須要,須要什麼樣的產品。
指揮者,從客戶端那裏接收到一系列須要,而後按照功能分割。
構建者,從指揮者手中獲得一個需求,並生產一個對於的產品。
對象建立型總體宏觀圖以下:
接口適配型
適配器模式:
對象調用接口 -> 適配器 -> 被適配接口,適配器可使本來不兼容的接口能夠一塊兒協調工做了。
使用場景:
已有類的接口與需求類接口不匹配。
應用實例:
Delegate是CocoaTouch框架中採用適配器模式(委託)的一種實現。實現協議的具體類是個適配器。
橋接模式:
把抽象層次結構從實現中分離出來,使其可以獨立變動。
抽象層定義了供客戶端使用的上層抽象接口。
實現層次結構定義了供抽象層次使用的底層接口。
不想在抽象與其實現之間造成固定的綁定關係;
客戶端抽象層引用着實現層抽象層;
外觀模式:
爲子系統中一組不一樣的功能接口,提供統一的外觀服務接口。
子系統變的愈來愈複雜,可使用外觀類爲這個子系統提供一個簡單的入口。
接口適配型總體宏觀圖以下:
對象去耦型
中介者模式
一句看概述:封裝對象間的交互。
中介者模式用於定義一個集中的場所,對象間的交互能夠在一箇中介者對象內處理, 從而避免其餘對象間的依存關係。
使用場景:
對象間的交互定義明確而複雜,致使一組對象彼此互相依賴且難以理解。
使用實例:
組件化開發中使用的路由器,就是一個利用反射機制實現的中介者。
觀察者模式
定義一種一對多的關係,使一個對象狀態改變,因此觀察者對象都收到通知。
觀察者模式也叫發佈-訂閱機制。
能夠利用Observer模式,令通知中心爲中介,能夠作到一個自定義對象經過通知中心 去通知到其餘多個對象的目的。
使用場景:
在MVC框架模式中,經過觀察着,實現Model,View的聯動。
抽象集合型
組合模式
組合模式讓咱們把相同基類型的對象組合到樹狀結構中,其中父節點包含同類型的子節點。
組件節點和葉子節點都是實現同一個基類接口。同一個抽象父類。
對組合對象的查詢,訪問都是遞歸操做。
將對象組合成樹形結構,以表示「總體-部分」的層次結構,組合使得用戶對單個對象和組合對象的操做具備一致性。
使用實例:
UIView的樹形結構,包含不少子View。
事件消息鏈,響應鏈傳遞。
迭代器模式
迭代器提供了一種 順序訪問聚合對象(集合)中元素的方法,而無需暴露結構的底層表示和結構細節。 遍歷集合元素的任務從集合 轉移給了迭代器對象。
使用場景:
須要訪問組合對象內容,而不想暴露內部表示,結構。
迭代器分爲內部迭代器和外部迭代器。
外部迭代器容許客戶端更自由的使用,同時須要熟悉組合對象的內部結構。
內部迭代器被封裝在集合內部,在集合外部提供接口。
使用實例:
集合對象(nsarray, nsdictionary)都默認提供了迭代器。
行爲擴展型
訪問者模式
做用於組合對象結構中的每個元素的操做,它讓咱們在不改變元素類的前提下,擴展這些類的新操做。
在接受訪問者的接口方法中,實現將元素傳給訪問者,而後訪問者擴展對元素的操做。
使用場景:
想對一個對象進行不少不相關的操做,又不想污染這個對象。
裝飾器模式
向對象添加行爲而不破壞其原有的風格,所以加強了的對象是同一個類的增強版。任何「加強」都可以動態添加和刪除。裝飾對象能夠附加到另外一裝飾對象,也能夠附加到原始對象。
使用場景:
在不影響對象的狀況下,動態,透明的給單個對象添加職責。
使用實例:
濾鏡操做,能夠無論濾鏡順序。
責任鏈模式
讓一組對象處理特定的請求,而對這個組中的成員(處理程序對象handler)增長,刪除不影響組的完整性。
鏈中的每個對象實現了一樣的方法,處理對鏈中第一個對象發起的同一個請求。 若是一個對象不知道如何處理這個請求,就把請求傳給下一個響應器(successor)。
使用場景:
向一組對象發送處理請求,而不想顯示的指定是哪一個對象進行處理。
算法封裝型
模版方法模式
在抽象父類中定義操做架構和公共操做,具體操做延遲到子類中實現。
在模版方法模式中,使子類能夠重定義算法的某些特定步驟而不改變算法結構。
使用場景:
須要一次性將不變部分寫好,將可變部分留給子類實現。
使用實例:
在UIView 中的方法draw:(CGRect)rect方法。
這個繪圖方法draw:爲UIView提供的鉤子函數,當用戶想要本身繪圖時,就能夠本身擴展添加。不實現也不影響功能。
策略模式
在面向對象設計中,將不一樣的算法分離成不一樣的類,稱爲策略。與這種作法相關的設計模式,稱爲策略模式。
使用場景:
在平時的函數中會出現if-else或者switch-case這樣的選擇語句,它們的不一樣分支下對應的是不一樣的算法。 而將這些不一樣的算法封裝成一個個不一樣的算法對象。實際上就是不一樣的策略。
使用實例:
控制器是視圖的策略類,視圖能夠由於控制器不一樣而展現不一樣的信息。
命令模式
在面向對象設計中,把指令封裝在各類命令對象中,命令對象能夠被傳遞, 而且在指定時刻被不一樣客戶的複用,從這一律念精心設計的模式被稱爲命令模式。
使用場景:
想讓程序支持撤銷恢復功能
使用實例:
NSInvocation, NSUndoManager是框架中這個模式的典型應用。
性能與對象訪問型
享元模式
運用共享技術,有效的控制大量細粒度的對象。
使用場景:
應用程序中使用大量對象時。
經過共享減小了多少對象總數。
使用實例:
屏幕上要展現1000朵小花,利用共享能夠只用10個imageData對象,1000個座標對象。
代理模式
爲其餘客戶端提供一種代理,來控制對真實對象的訪問。
遠程代理:用本地對象代替遠程對象。如:發送網絡時的代理服務器。
虛擬代理:將代理直接面向客戶端,使客戶端認爲操做的虛擬代理就是真實對象。虛擬代理提供佔位對象和重型對象。默認使用佔位對象,當須要使用重型對象時才加載。
使用實例:
Object-C不支持多繼承,若是代理對象不是NSObject的子類的話,能夠考慮用NSProxy來做爲佔位或者替代對象。
儘管NSProxy也是NSObject類型,可是NSProxy的做用就是當代理。
對象狀態型
備忘錄模式
在不破壞原有封裝的前提下,捕獲一個對象的內部狀態,並在該對象以外保存狀態。 這樣,以後可將對象恢復到以前的狀態。將狀態封裝成對象保存。
使用場景:
須要保存對象在某一時刻的狀態(或部分狀態),這樣之後就能夠恢復到先前的狀態。
使用實例:
Cocoa Touch框架在歸檔,屬性列表序列化,核心數據中採用了備忘錄模式。
完整項目地址以下:
https://github.com/zhfei/Objective-C_Design_Patterns