1. 程式人生 > >Android開發中常用到的設計模式

Android開發中常用到的設計模式

單例模式

保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。

熱門詞彙:單例 唯一 私有構造

單例模式好處

  • 由於單例模式在記憶體中只有一個例項,減少了記憶體開銷。對於那些耗記憶體的類,只例項化一次,大大提高效能,尤其是移動開發中。

  • 單例模式可以避免對資源的多重佔用,例如一個寫檔案時,由於只有一個例項存在記憶體中,避免對同一個資原始檔的同時寫操作。

  • 單例模式可以在系統設定全域性的訪問點,優化和共享資源訪問。

適用場景

  • 應用中某個例項物件需要頻繁的被訪問。

  • 應用中每次啟動只會存在一個例項,如賬號系統,資料庫系統。

在計算機系統中,執行緒池、串列埠、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。android中有很多系統級別的全域性變數,如時間,輸入法,賬戶,狀態列等等,android中對這些都直接或者有些間接用到了單例模式。

對於開發過程中,使用Fragment可以用單例模式。另外還有Application類,全域性只有一個,不過這個類特殊地方是建構函式並非私有,所以不算是標準的單例模式。

介面卡模式

介面卡模式,把一個類的介面變換成客戶端所期待的另一種介面,從而使原本不匹配而無法在一起工作的兩個,類能夠在一起工作。

介面卡模式分為類介面卡模式和物件介面卡模式。

ListView或GridView的Adapter,不同的資料來源都可以向同一個ListView或GridView提供資料。

ListView 作為 client,他所需要的目標介面(target interface)就是ListAdapter,包含getCount()、getItem()、getView()等幾個基本的方法。

為了相容List,Cursor等資料型別作為資料來源,我們專門定義兩個介面卡來適配他們:ArrayAdapter和CursorAdapter。這兩個介面卡,說白了,就是針對目標介面對資料來源進行相容修飾。

其中BaseAdapter實現瞭如isEmpty()方法,使子類在繼承BaseAdapter後不需要再實現此方法,這就是預設介面卡,這也是預設介面卡的一個最明顯的好處。

模板方法模式

定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

熱門詞彙:骨架 步驟 結構 延遲到子類

新建一個Actiivty時都會覆蓋onCreate、onResume等生命週期方法,這些方法是在父類中定義好的模板,會由系統自動回撥,我們可以通過重寫來替換掉這些方法,卻無法改變他們的呼叫順序。這是典型的模板方法模式。

我們在定義某些類時,常常會在父類中定義一個流程,然後在子類中去重寫這個流程中的一些方法,這也是使用了模板方法模式。

比如我們會在Activity的onCreate方法裡作控制元件初始化、事件監聽操作,幾乎所有Activity都會有這些操作,所以我們在BaseActivity基類中定義這個流程:(對映xml,執行findViewById)findWidget()–>(對初始化後的控制元件設定顯示以及初始化資料)initWidget()–>
(設定各類監聽事件)setListener(),然後每個Activity實現這些抽象方法即可。

觀察者模式

定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

熱門詞彙:依賴 釋出-訂閱 事件 通知 更新 監聽

Android中的各種Listener,單擊、雙擊、觸控事件的監聽處理,都是觀察者模式。另外還有ContentObserver、DataSetObserver、廣播等。

代理模式

Android大量使用了代理模式來向用戶層提供系統服務。由於系統服務是執行在單獨的遠端程序中,Android系統通過Binder為遠端服務提供了代理物件,應用可以通過代理物件來間接的訪問系統服務。

比如ActivityManagerService的主要作用是進行Activity的管理,使用者無法直接訪問ActivityManagerService,系統為我們提供了一個代理物件ActivityManager,通過它就可以獲得ActivityManagerService提供的相關功能。

責任鏈模式

Android中Touch事件的處理機制就符合責任鏈模式依次分發處理事件的特點,請求在各層級View之間依次傳遞,然後判斷是否需要處理還是傳遞給下一級。

享元模式

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

熱門詞彙:共享 池 快取 內部狀態 外部狀態 物件 單例

java中的享元模式最經典的例子就是String類了,還有一個最容易理解的就是word文件字元共享的例子,也是享元模式的經典應用。

享元模式用於重複物件的複用,防止頻繁的建立物件。Message的obtainMessage方法可以實現Message物件的重用,以避免大量的Message物件被頻繁的建立和銷燬,Handler也提供了obtainMessage方法實現同樣的功能。因此,在使用Message的時候儘量不要通過new的方式手動去建立。

還有android中的sql編譯類SQLiteCompiledSql也使用到了該模式。

建造者模式

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

Effective Java裡說,當遇到多個構造器引數時,考慮用建造者模式,建造者模式主要解決建構函式過多的問題。

AlertDialog和Notification的構建都是使用的建造者模式,他們都提供了Builder靜態內部類來實現建造過程,而Builder類提供了build方法實現最終物件的建立。

android中大量的使用對話方塊元件,它的呼叫方法就是構建,拼接,表示。Builder通過setTitle(),setMessage(),setIcon()等方法在create()中構造出一個AlertDialogInstance物件,然後客戶可以把AlertDialogInstance物件show出去。

命令模式

將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作。

熱門詞彙:動作 事物 請求封裝 排隊 打包 非同步

Android中兩個典型的使用命令模式的類是Handler和ExecutorService。Handler類提供了post方法傳送命令,ExecutorService類通過submit方法提交命令。

另外還有android中多執行緒多程序的環境大量使用到的Runbable,Thread也是命令模式。客戶端只需要new Thread(new Runnable(){}).start()就開始執行相關的一系列的請求,這些請求大部分都是實現Runnable介面的匿名類。

原型模式

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

熱門詞彙:克隆 深拷貝 淺拷貝

CV一族,應該很容易理解原型模式的原理,複製,貼上完後看具體情況是否修改,其實這就是原型模式。

從java的角度看,一般使用原型模式有個明顯的特點,就是實現cloneable的clone()方法。

在Android中,Intent、Bundle類都實現了clone方法。

另外,Bitmap中也用到了原型模式。如果我們需要一張Bitmap的幾種不同格式(ARGB_8888、RGB_565等),那我們就可以先建立一個ARGB_8888的Bitmap作為原型,在它的基礎上,通過呼叫Bitmap.copy(Config)來創建出其它格式的Bitmap。

備忘錄模式

在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可以將該物件恢復到先前儲存的狀態。

熱門詞彙:標記 狀態 備忘錄 原發器

備忘錄模式主要功能是實現狀態或資料的備份和恢復。那麼,很容易想到在Android中有與它對應的一套機制,即onSaveInstanceState和onRestoreInstanceState,這兩個方法分別實現View或者Activity關鍵狀態的儲存和恢復,具體用法相信大家已經很清楚了。

Canvas類中的save和restore兩個方法也是使用了備忘錄模式。

工廠方法模式

定義一個用於建立物件的介面,讓子類決定例項化哪個類。工廠方式模式使一個類的例項化延遲到其子類。

熱門詞彙:虛構造器 延遲 建立物件 子類

工廠方法模式在Android中比較明顯的使用就是BitmapFactory,通過各種decodeXXX()方法就可以用不同方式獲得Bitmap物件。還有執行緒中的ThreadFactory,也用到了該模式。

策略模式

定義一系列的演算法,把它們一個個封裝起來,並且使它們可互相替換。

策略模式使得演算法可獨立於使用它的客戶而變化。

比如排序,官方告訴大家我這裡有一個排序的介面ISort的sort()方法,然後民間各盡其能,實現這個排序的方法:冒泡,快速,堆等等,這些方法就是“不同的策略”。

Android通過Animation來實現不同的動畫,Animation可以設定不同的Interpolator,Interpolator就是提供了不同的策略,使得最終的動畫呈現出來不同的效果。

組合模式

將物件View和ViewGroup組合成樹形結構以表示”部分-整體”的層次結構(View可以做為ViewGroup的一部分)。

組合模式使得使用者對單個物件View和組合物件ViewGroup的使用具有一致性。

熱點詞彙: 部分-整體 容器-內容 樹形結構 一致性 葉子 合成 安全性 透明性

Android中對組合模式的應用,可謂是氾濫成粥,隨處可見,那就是View和ViewGroup類的使用。在android UI設計,幾乎所有的widget和佈局類都依靠這兩個類。