1. 程式人生 > >Android設計模式之23種設計模式一覽

Android設計模式之23種設計模式一覽

本文轉載自https://blog.csdn.net/happy_horse/article/details/50908439

Android設計模式之23種設計模式一覽

 

一  什麼是設計模式?

(1)基本定義:設計模式(Design pattern)是一套被反覆使用的程式碼設計經驗的總結。使用設計模式的目的是為了可重用程式碼、讓程式碼更容易被他人理解。設計模式是是軟體工程的基石脈絡,如大廈的結構一樣。

(2)Design pattern的四大要素:模式名稱(Name),問題(Question),解決方案(Solution),效果(Efftive)。

(3)OO(面向物件)的六大原則:單一職責原則,開閉原則,里氏替換原則,依賴倒置原則,介面隔離原則,迪米特原則。

單一職責原則:一個類中應該是一組相關性很高的函式,資料的封裝。兩個完全不一樣的功能就不應該放在一個類中。

開閉原則:對修改封閉,對擴充套件放開。

里氏替換原則:抽象和繼承;所有引用基類的地方必須能透明的使用其子類的物件。

依賴倒置原則:抽象不應該依賴細節,細節應該依賴抽象。

介面隔離原則:將大介面改成多個小介面。

迪米特原則:也稱為最少知識原則,一個物件應該對另一個物件有最少的瞭解。

 

二 設計模式的分類

設計模式分為三種類型:

(1)建立型模式5種:單例模式,抽象工廠模式,工廠模式,原型模式,建造者模式。

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

(2)結構型模式7種:介面卡模式,橋接模式,裝飾模式,組合模式,外觀模式,享元模式,代理模式。

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

(3)行為型模式11種:觀察者模式,中介者模式,訪問者模式,直譯器模式,迭代器模式,備忘錄模式,責任鏈模式,狀態模式,策略模式,命令模式,模板模式。

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

 

三  Android中的設計模式

(1)單例模式:

簡介:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
示例:Android中的系統級服務都是通過容器的單例模式實現方式,以單例形式存在,減少了資源消耗。

比如LayoutInflater Service,將這些服務以鍵值對的形式儲存在一個HashMap容器中,使用者使用時只需要根據key來獲取到對應的ServiceFetcher,然後通過ServcieFetcher物件的getService函式來獲取到具體的服務物件,第一次獲取時會呼叫ServcieFetcher的createService函式建立服務物件,然後將該物件快取到一個列表中,下次再取時直接從快取中獲取,避免重複建立物件,從而達到單例的效果。

(2)抽象工廠模式:

簡介:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

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

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

(3)工廠模式:

簡介:定義一個用於建立物件的介面,讓子類決定將哪一個類例項化。

示例:BitmapFactory點陣圖工廠,專門用來將指定的圖片轉換為指定的點陣圖Bitmap。

(4)原型模式:

簡介:用原型例項指定建立物件的種類,並且通過拷貝這個原型來建立新的物件。

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

(5)建造者模式:

簡介:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

示例:AlertDialog.Builder   ImageLoader的初始配置。

(6)介面卡模式:

簡介:將一個類的介面轉換成客戶希望的另外一個介面。

示例:不同的資料提供者使用一個介面卡來向一個相同的客戶提供服務。

ListView或GridView的Adapter。

(7)橋接模式:

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

示例:Window和WindowManager之間的關係。

在FrameWork中Window和PhoneWindow構成視窗的抽象部分,其中Window類為該抽象部分的抽象介面,PhoneWindow為抽象部分具體的實現及擴充套件。而WindowManager則為實現部分的基類,WindowManagerImpl則為實現部分具體的邏輯實現。

(8)裝飾模式:

簡介:動態地給一個物件新增一些額外的職責。就擴充套件功能而言, 它比生成子類方式更為靈活。

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

(9)組合模式:

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

示例:View和ViewGroup的組合

(10)外觀模式

簡介:為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,統一程式設計介面。

示例:ContextImpl

(11)享元模式:

簡介:運用共享技術有效地支援大量細粒度的物件。

示例:Message.obtainMessage通過重用Message物件來避免大量的Message物件被頻繁的建立和銷燬。

(12)代理模式:

簡介:為其他物件提供一個代理以控制對這個物件的訪問。

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

(13)觀察者模式:

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

示例:我們可以通過BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver兩方法來向BaseAdater註冊、登出一個DataSetObserver。這個過程中,DataSetObserver就是一個觀察者,它一旦發現BaseAdapter內部資料有變數,就會通過回撥方法DataSetObserver.onChanged和DataSetObserver.onInvalidated來通知DataSetObserver的實現類。事件通知也是觀察者模式。

(14)中介者模式:

簡介:用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。

示例:Binder機制。

(15)訪問者模式:

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

示例:編譯時註解中的ElementVisitor中定義多個Visit介面,每個介面處理一種資料型別,這就是典型的訪問者模式,訪問者模式正好解決了資料結構和資料操作分離的問題,避免某些操作汙染了資料物件類。

(16) 直譯器模式:

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

示例:PackageParser這個類對AndroidManifest.xml這個配置檔案的解析過程,

(17)迭代器模式

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

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

(18)備忘錄模式

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

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

(19)責任鏈模式

簡介:有多個的物件可以處理一個請求,哪個物件處理該請求執行時刻自動確定。

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

(20)狀態模式:

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

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

(21)策略模式

簡介:定義了一系列封裝了演算法、行為的物件,他們可以相互替換。

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

(22)命令模式

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

示例:Handler.post後Handler.handleMessage。

(23)享元模式

簡介:運用共享技術有效地支援大量細粒度的物件。

示例:Message.obtainMessage通過重用Message物件來避免大量的Message物件被頻繁的建立和銷燬。