何爲適配器模式?git
適配器模式,能夠這麼說,用於鏈接兩種不一樣種類的對象,使其毫無問題地協同工做。有時它也稱爲包裝器。其思想至關簡單,適配器實現客戶端所要的某種接口的行爲,同時,它又鏈接到另外一個具備徹底不一樣接口與行爲的對象。一邊是客戶端懂得如何使用的目標接口,另外一邊是客戶端一無所知的被適配者。適配器站在二者之間,適配器的主要做用是把被適配者的行爲傳遞給管道另外一端的客戶端。github
基本上有兩種實現適配器的方式。第一種是經過集成來適配兩個接口,這稱爲類適配器。類適配器是經過多重集成來實現的。第二種是對象適配器,與類適配器不一樣,對象適配器不繼承被適配者,而是組合了一個對它的引用。ide
適配器模式:將一個類的接口轉換成客戶端但願的另外一個接口。適配器模式使得原來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。spa
類適配器與對象適配器的區別?設計
類適配器:只針對單一的具體Adaptee類,把Adaptee適配到Target;易於重載Adaptee的行爲,由於是經過直接的子類化進行的適配;只有一個Adapter對象,無需額外的指針間接訪問Adaptee。指針
對象適配器:能夠適配多個Adaptee及其子類;難以重載Adaptee的行爲,須要藉助於子類的對象而不是Adaptee自己;須要額外的指針以間接訪問Adaptee並適配其行爲。對象
顯然,委託(Delegate)屬於對象適配器。blog
什麼時候使用適配器模式?繼承
@:已有類的接口與需求不匹配。接口
@:想要一個可複用的類,該類可以同可能帶有不兼容接口的其餘類協做。
@:須要適配一個類的幾個不一樣子類,但是讓每個子類去子類化一個類適配器又不現實。那麼就可使用對象適配器(也叫委託)來適配其父類接口。
在OC當中經過委託(Delegate)實現適配器。
何爲觀察者模式?
在觀察者模式中,一個對象任何狀態的變動都會通知另外的對改變感興趣的對象。這些對象之間不須要知道彼此的存在,這實際上是一種鬆耦合的設計。當某個屬性發生變化的時候,咱們一般使用這個模式去通知其它對象。
此模式的通用實現中,觀察者註冊本身感興趣的其它對象的狀態的變動事件。當狀態發生變化的時候,全部觀察者都會收到通知。蘋果的推送通知就是一個此模式例子。若是你要遵循MVC模式的概念,你須要讓模型對象與視圖對象在不相互直接引用的狀況下通訊。這正是觀察者模式的用武之地。
Cocoa經過使用通知(NSNotification)與KVO來實現觀察者模式。
通知與KVO
通知:通知是一種基於訂閱-發佈模式的模型,它讓發佈者能夠給訂閱者發送消息,而且發佈者不須要對訂閱有任何的瞭解。通知在蘋果官方被大量的使用,當鍵盤彈出或隱藏的時候,系統會獨立的發送UIKeyboardWillShowNotification/UIKeyboardWillHideNotification通知。當你的應用進入後臺運行的時候,會發送UIApplicationDidEnterBackgroundNotification通知。當你打開UIApplication.h文件,在文件末尾你將會看到大量由系統發出的通知。
KVO機制讓對象能夠感知屬性的變化,這種機制在模型-視圖-控制器模式的場景中尤爲重要,由於它讓視圖對象能夠經由控制器層觀察模型對象的變動。
通知與KVO的主要區別:通知,一箇中心對象爲全部觀察者提供變動通知,主要從廣義上關注程序事件。KVO,被觀察的對象直接向觀察者發送通知,綁定於特定對象屬性的值。
什麼時候使用觀察者模式?
@:有兩種抽象類相互依賴。將它們封裝在各自的對象中,就能夠對它們單獨進行改變和複用。
@:對一個對象的改變須要同時改變其餘對象,而不知道具體還有多少對象有待改變。
@:一個對象必須通知其餘對象,而它又不須要知道其餘對象是什麼。
參考文章:
http://blog.jobbole.com/55505/
demo地址: