最近在學習《objective-c程式設計之道:ios設計模式解析》,本文是對外觀模式的乙個分析和例子實現。
裡面包含書的例子。
標籤:介面適配
外觀模式為子系統中一組不同的介面提供統一的介面。類圖如下:外觀定義了上層介面,通過降低複雜度和隱藏子系統間的通訊及依存關係,讓子系統更易於使用。
子系統正逐漸變得複雜
使用外觀模式對子系統分層
這裡先使用書中的乙個簡單例子。
有一名計程車司機,一輛車和一台計價器。
現在要使用這個計程車服務,作為一名乘客,我們只需要告訴司機我們要哪,剩下的全部事情交給司機完成。
計程車司機就是外觀,而車和計價器則是子系統,供司機操作。
類圖如下:
乘客使用計程車服務的唯一途徑就是告訴司機去哪,而不是乘客自己按下計價器,自己踩油門換擋開車。因此我們只需要知道介面drivetolocation,傳入引數「目的地」即可:
而司機cabdriver類,則會引入計價器taximeter類和車car類,持有它們的例項:
計價器taximeter類和車car類本身則定義了一系列操作的介面,供司機cabdriver類呼叫。
比如計價器taximeter類有開始計價和結束計價方法:
車car類有一些操控的方法:
這兩個類的具體實現是個複雜系統,封裝了能直接使用的介面。然而即使這些介面已經簡化了許多,對乙個只關心到達目的地的乘客來說,還是太複雜了。司機類的作用就是攬下這個活兒,無論這個子系統有多麼複雜,司機類都把它們隱藏於乘客的視線之外,讓乘客只看到作為外觀的司機。因此,司機類cabdriver是在為計程車子系統中的其他複雜介面提供乙個簡化的介面。
當乘客告訴司機目的地後,在具體的實現裡,司機類使用taximeter和car的例項來呼叫一系列方法,完成一次計程車服務:
到此,就是乙個外觀模式的簡單例子。
外觀模式是物件導向程式設計裡使用得很頻繁的乙個模式。最經常見到的例子就是各種庫里的manager類。
比如sdwebimage,超級簡化版的類圖如下:
這就是典型的外觀模式。特別需要注意的是子系統的分層。前面提到在什麼情境下用外觀模式時:
使用外觀模式對子系統分層像sdwebimage這樣功能全面、稍微複雜一點的庫,就會產生分層的需求。這些都是在實踐中需要多加思考的點。
當程式逐漸變大變複雜時,會有越來越多小型的類從設計和應用模式中演化出來。外觀模式屬於介面適配這個類別。介面適配類別都關注用更簡單的介面或用不同的介面去適配各種介面,是物件導向程式設計方法裡降低程式複雜度的利器。如果沒有一種簡化的方式來使用這些類,客戶端**最終將會變得越來越大、越來越難以理解,而且,維護起來會繁瑣無比。
iOS設計模式 外觀
外觀 為系統中的一組介面提供乙個統一的介面。外觀定義乙個高層的介面,讓子系統更易於使用。子系統正逐漸變的複雜。應用模式的過程中演化出許多類。可以使用外觀為這些子系統類提供乙個較簡單的介面。可以使用外觀對子系統進行分層。每個子系統級別有乙個外觀作為入口點。讓它們通過其外觀進行通訊,可以簡化它們的依賴關...
iOS設計模式 外觀
ios設計模式 外觀 原理圖 1.當客服端需要使用乙個複雜的子系統 子系統之間關係錯綜複雜 但又不想和他們扯上關係時,我們需要單獨的寫出乙個類來與子系統互動,隔離客戶端與子系統之間的聯絡,客戶端只與這個單獨寫出來的類互動 2.外觀模式實質為為系統中的一組介面提供乙個統一的介面,外觀定義了乙個高層介面...
iOS設計模式 外觀
ios設計模式 外觀 原理圖 1.當客服端需要使用乙個複雜的子系統 子系統之間關係錯綜複雜 但又不想和他們扯上關係時,我們需要單獨的寫出乙個類來與子系統互動,隔離客戶端與子系統之間的聯絡,客戶端只與這個單獨寫出來的類互動 2.外觀模式實質為為系統中的一組介面提供乙個統一的介面,外觀定義了乙個高層介面...