iOS之13種設計模式
基本原則
-
開閉原則(Open Close Principle):對擴展打開,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。簡言之,是為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類,后面的具體設計中我們會提到這點。
-
里氏代換原則(Liskov Substitution Principle):父子可以相互調用,父類必須提供足夠多的抽象方法供子類重載使用。 任何基類可以出現的地方,子類一定可以出現。LSP 是繼承復用的基石,只有當派生類可以替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被復用,而派生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。
-
依賴倒轉原則(Dependence Inversion Principle):抽象不依賴細節,細節依賴抽象。這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴于抽象而不依賴于具體。
-
接口隔離原則(Interface Segregation Principle):盡量做必要的事。使用多個隔離的接口,比使用單個接口要好。它還有另外一個意思是:降低類之間的耦合度。由此可見,其實設計模式就是從大型軟件架構出發、便于升級和維護的軟件設計思想,它強調降低依賴,降低耦合。
-
最少知道原則(Demeter Principle):個實體應當盡量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
-
合成/聚合復用: 盡量使用合成/聚合的方式,而不是使用繼承。
13種設計模式
適配器模式
-
何為適配器模式?
適配器模式將一個類的接口適配成用戶所期待的。一個適配器通常允許因為接口不兼容而不能一起工作的類能夠在一起工作,做法是將類自己的接口包裹在一個已存在的類中。(聯想一下現實生活中的各類適配,就比較容易理解了)
-
如何使用適配器模式?
以下情況比較適合使用 Adapter 模式:
- 當你想使用一個已經存在的類,而它的接口不符合你的需求;
- 你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作;
- 你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口,對象適配器可以適配它的父親接口。
-
適配器模式的優缺點?
優點:降低數據層和視圖層(對象)的耦合度,使之使用更加廣泛,適應復雜多變的變化。
缺點:降低了可讀性,代碼量增加,對于不理解這種模式的人來說比較難看懂。
-
github示例代碼
ios設計模式之適配器模式
策略模式
-
何為策略模式?
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
-
如何使用策略模式?
在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
- 如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。
- 一個系統需要動態地在幾種算法中選擇一種。
- 如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
- 注意事項 :如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
-
策略模式的優缺點?
優點:簡化操作,提高代碼維護性。算法可以自由切換,避免使用多重條件判斷,擴展性良好。
缺點:在使用之前就要確定使用某種策略,而不是動態的選擇策略。策略類會增多,所有策略類都需要對外暴露。
-
github示例代碼
ios設計模式之策略模式
觀察者模式
- 何為觀察者模式?
當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬于行為型模式。 - 如何使用觀察者模式?
一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。 - 觀察者模式的優缺點?
優點:1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發機制。
缺點:1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。 - gitHub示例代碼
iOS設計模式之觀察者模式 - 設計模型圖 (在敲代碼的時候要多想想這個模型圖)
觀察者模型圖.png
原型/外觀模式
- 何為原型/外觀模式?
- 如何使用原型/外觀模式?
- 原型/外觀模式的優缺點?
裝飾模式
- 何為裝飾模式?
- 如何使用裝飾模式?
- 裝飾模式的優缺點?
工廠模式
- 何為工廠模式?
- 如何使用工廠模式?
- 工廠模式的優缺點?
橋接模式
- 何為橋接模式?
- 如何使用橋接模式?
- 橋接模式的優缺點?
代理模式
- 何為代理模式?
- 如何使用代理模式?
- 代理模式的優缺點?
單例模式
- 何為單例模式?
- 如何使用單例模式?
- 單例模式的優缺點?
備忘錄模式
- 何為備忘錄模式?
- 如何使用備忘錄模式?
- 備忘錄模式的優缺點?
生成器模式
- 何為送生成器模式?
- 如何使用生成器模式?
- 生成器模式的優缺點?
命令模式
- 何為命令模式?
- 如何使用命令模式?
- 命令模式的優缺點?
組合模式
- 何為適配器模式?
- 如何使用適配器模式?
- 適配器模式的優缺點?
總結
- 代碼建議有興趣的同學可以自己敲一遍,便于加深理解。如果覺得github代碼還不錯請不要吝惜star,每一個star都是我堅持走下去的動力,三克油。
- 每種設計模式都是有特定的使用背景的,在設計之前要多加進入‘上帝模式’,站的更高才能看的更遠。
- 本文的13中設計模式只是比較常用的一些設計模式,還有其他的一些設計模式,希望不喜勿噴。
- 如果有什么建議請多多留言,我會一一回復的。
來自:http://www.jianshu.com/p/9c4a219e9cf9