Android開發中23種設計模式——簡介

最近在看《設計模式》,對23中設計模式有了初步瞭解,後面一段時間將會對其一一記錄。

首先對設計模式做一個簡單的介紹

Android中的23種設計模式

(1)創建型模式5種:單例模式、工廠模式、抽象工廠模式、原型模式、建造者模式(builder)

(口訣:單原建造者,東西二廠)

(2)結構型模式7種:適配器模式、橋接模式、裝飾者模式、組合模式、外觀模式、享元模式、代理模式

(口訣:一器一橋一元一代理,裝飾組合外觀)

(3)行爲性模式11種:觀察者模式、中介者模式、解釋器模式、迭代器模式、備忘錄模式、責任鏈模式、狀態模式、策略模式、命令模式、模板模式

(口訣:三者兩器、一錄一鏈一模板、狀態策略命令)


1、單例模式

簡介:保證一個類僅有一個實例,並提供一個訪問他的全局訪問點。

示例:Android中的系統級符文都是通過容器的單例模式實現方式,以單例形式存在,減少了資源的消耗。比如LayoutInflater Service,將這些服務以鍵值對的形式存儲在一個HashMap容器中,用戶用時只需根據key來獲取到對應的ServiceFetcher,然後通過ServiceFetcher對象的getService函數來獲取到具體的服務對象,第一次獲取時會調用Service的createService函數創建服務對象,然後將該對象緩存到一個列表中,下次再取時直接重緩存中獲取,避免重複創建對象,從而達到單例的效果。

2、工廠模式

簡介:定義一個用於創建對象的接口,讓子類覺得將哪個類實例化。

示例:BitmapFactory位圖工廠,專門用來將指定的圖片轉回爲指定的位圖Bitmap。

3、抽象工廠模式

簡介:提供一個創建一系列相關或者相互依賴對象的接口,而無需指定他們具體的類。

示例:Android底層對MediaPlayer的創建。

MediaPlayerFactory是Android底層爲了創建不同的MediaPlayer所定義的一個類。

4、原型模式

簡介:用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。

示例:比如我們需要一張Bitmap的幾種不同格式:ARGB_8888、RGB_565、ARGB_4444、ALAPHA_8等。那我們就可以先創建一個ARGB_8888的Bitmap爲原型,在它的基礎上,通過調用Bitmap.copy(Config)來創建出其他幾種格式的Bitmap。另外一個例子就是Java中所有對象都有一個名字叫clone的方法,已經是原型模式的代名詞了。在系統中要創建大量的對象,這些對象之間具有幾乎完全相同的功能,只在細節上有點差別。

5、建造者模式

簡介:將一個複雜對象的構建與他的表示分離,使得同樣的構建過程可有創建不同的表示。

示例:AlertDialog.Bulder    ImageLoader的初始配置

6、適配器模式

簡介:講一個類的接口換成客戶希望的另外一個接口

示例:不同的數據提供者使用一個適配器來向一個相同的客戶提供服務。ListView或GridView的Adapter

7、橋接模式

簡介:將抽象部分與它的現實不符分離,使他們都可以獨立的變化

示例:Window和WindowMananger之間的關係

在Framwork中的Window和PhoneWindow構成的窗口的抽象部分,其中Window類爲該部分的抽象接口,PhoneWindow爲抽象部分具體的實現及擴展。而WindowMananger則爲實現部分的基類,WindowManangerImpl則爲實現部分具體的邏輯實現.

8、裝飾模式

簡介:動態的給一個對象添加一些額外的職責。就擴展功能而言,它比生成子類方式更爲靈活。

示例:Activity繼承自ContextThemeWrapper,ContextThemeWrapper繼承自ContextWrapper,ContextWrapper才繼承自Context,ContextWrapper就是我們的裝飾者。

9、組合模式

簡介:將對象組合成樹形結構以表示“部分-整體”的層次結構。

示例:View和ViewGroup的組合

10、外觀模式

簡介:爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,統一編程接口。

示例:ContextImpl

11、享元模式

簡介:運用共享技術有效的支持細粒度大的對象

示例:Message.obtainMessage通過重用Message對象來避免大量的Mesage對象唄頻繁的創建和銷燬。

12、代理模式

簡介:爲其他對象提供一個代理以控制對這個對象的訪問

示例:所有的AIDL都是一個代理模式的例子。假設一個Activity A去綁定一個Service S,那麼A調用S中的每一個方法其實都是通過調用系統的Binder機制的中轉,然後調用S中的對應的方法來做到的,Binder機制就起到了代理的作用。

13、觀察者模式

簡介:一個對象發生改變時,所有信賴於它的對象自動做出相應的改變。

示例:我們通過BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetOberver兩個方法來向BaseAdapter註冊、註銷一個DataSetObserver。這個過程中DataSetObserver就是一個觀察者,一單發現BaseAdapter內部數據有變化,就會通過回調方法DataSetObserver.onChanged和DataSetObserver.onInvalidated來通知DataSetObserver的實現類。事件通知也是觀察者模式。

14、中介者模式

簡介:用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互作用,從而使其解耦鬆散,而且可以獨立的改變他們之間的交互。

示例:Binder機制。

15、訪問者模式

簡介:表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

示例:編譯時註解中的ElementVisitor中定義了多個Vistit接口,每個接口處理一種數據類型,這就是典型的訪問者模式,訪問者模式正好解決了數據結構和數據操作分離的問題,避免某些操作污染了數據對象類。

16、解釋器模式

簡介:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

示例:PackageParser這個類對AndroidManifest.xml這個配置文件的解析過程。

17、迭代器模式

簡介:提供一種方法順序訪問一個聚合對象中各個元素,而又不需要暴露該對象的內部表示。

示例:在Android中除了各種數據結構體,如List,Map,等包含迭代器以外,Android源碼中也提供了迭代器遍歷模式,比如數據庫查詢使用的Cursor,當我們使用SQLiteDataBase的query方法查詢數據庫時,會返回一個Cursor遊標對象,該遊標對象實際上就是一個具體的迭代器。

18、備忘錄模式

簡介:不需要了解對象的內部結構的情況下備份對象的狀態,方便以後恢復。

示例:Activity的onSaveInstanceState和onRestoreInstanceState就是通過Bundle這種序列化的數據結構來存儲Activity的狀態,至於其中存儲的數據結構,這兩個方法不用關心。

19、責任鏈模式

簡介:有多個對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。

示例:責任鏈模式在Android源碼中比較類似的實現莫過於對事件的分發處理,每當用戶接觸屏幕的時候,Android都會講對應的事件包裝成一個事件對象從ViewwTree的頂部至上而下的分發傳遞。ViewGroup事件投遞的遞歸調用就類似一個責任鏈,一旦尋找到責任者,那麼就由責任者持有並消費該次事件,具體的提現在View的onTouchEvent方法中的返回值,如果onTouchEvent返回false,那麼意味着當前View不會是該次事件的責任人,將不會持有該事件。

20、狀態模式

簡介:狀態發生改變時,行爲改變。

示例:View.onVisibilityChanged方法,就是提供了一個狀態模式的實現,允許在View的visibility發生改變時,引發執行onVisibilityChanged方法中的動作。

21、策略模式

簡介:鄧毅了一系列封裝了算法、行爲的對象,他們可以相互替換。

示例:Java.util.List就是定義了一個增(add)、刪(remove)、改(set)、查(indexOf)策略,至於實現這個策略的ArrayList、LindedList等類,只是在具體實現時採用了不同算法。但因爲他們策略一樣,不考慮速度的情況下,使用時完全可以相互替換使用。

22、命令模式

簡介:把請求封裝成一個對象發送出去,方便定製、排隊、取消。

示例:Handler.post後Hanlder.handleMessage。

23、模板模式

簡介:定義一個方法操作算法的框架(骨架結構),而將一些步驟延遲到子類中。模板方法使子類可以在不改變一個算法的結構的情況下,就可以重定義該算法的某些特定步驟。


以上是轉載內容




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章