1. 程式人生 > >android設計模式初探

android設計模式初探

最近學習android設計模式,現將一些重點記錄下來。
設計模式是程式設計過程中的思想,能夠幫助我們解決很多軟體開發過程中的很多問題,更重要的是可以使你設計的軟體結構清晰、拓展性更強。
設計模式的根本原則是:抽象、單一職責和最小化
六大原則:
(一)單一職責原則:
兩個完全不一樣的功能不應該放在同一個類裡。
(二)開閉原則:
對於拓展是開放的,對於修改是封閉的,一般可以通過抽象來實現。(介面和抽象類)
(三)里氏替換原則:
所有引用基類的地方必須能夠透明的使用其子類的物件
(四)依賴倒置原則:
模組之間的依賴關係是通過介面或抽象類產生的。
(五)介面隔離原則:
應該把龐大、臃腫的介面拆分為更小更具體的介面。
(六)迪米特原則:


一個類應該對自己呼叫或需要耦合的類知道的最少。
二十三種設計模式:
一、單例模式
用於確保某個類有且只有一個物件的場景。最好是使用靜態內部類單例模式。
二、Builder模式
將一個複雜物件的構建過程和該物件的表示分離開來,常用於一個複雜物件可以有多重不同的組裝方法,不同的組裝可以產生不同的物件表示。如AlertDialog的建立。在類中有一個內部類,該內部類有一些set方法和一個create方法。
三、原形模式
當一個物件在建立過程中使用資源比較多時,採用克隆的方法複製一個已經存在的物件,可用於對物件狀態的儲存與備份。用類實現cloneable介面就可實現原型模式。他與備忘錄模式的主要區別在於,原型模式用於新物件的建立,而備忘錄不會建立新物件。
四、工廠方法模式

用於構建大型別相同,但具體有差異的一類物件,可以把這類物件的構建統一起來,使用者使用時,只要給工廠輸入不同的引數就可以構建所需要的物件。可以使用反射類實現工廠方法,比如對於存在多種不同方式進行本地資料持久化的情況就可以使用工廠方法。
工廠方法與builder方法的區別在於builder處理的是物件的構建過程比較複雜,比如要根據不同的需要設定不同的引數,但構建後物件的行為是不變的。而工廠方法則是處理一大類相似物件的構建問題,構建後不同的具體物件有不同的行為。
五、抽象工廠模式
建立一個物件族,這個物件族有相同的約束。工廠方法是用一個工廠建立不同的產品,而抽象工廠是用不同的工廠來建立不同的產品。
與工廠方法模式相似,其區別在於所建立的工程類是抽象的還是具體的,如果工廠類是抽象的,則是抽象工廠模式。
六、策略模式

一個問題有多種不同的解決方案(或處理方法),需要根據使用者的需要在某個具體的問題中選擇一種解決方法。在相同的行為抽象下有不同的具體實現策略。比如使用者在載入圖片時可以有不同的載入策略的情況。
七、狀態模式
同一個物件當其內部狀態發生改變時要求其行為也隨之改變。比如在系統的登入狀態和非登入狀態通常要求對於使用者的操作有不同的響應。實現中可以定義一個狀態介面和一個狀態控制類,然後不同的狀態都實現介面,對於介面中的函式進行自己的實現。
八、責任鏈模式
用於多個不同的物件都可以處理同一個請求,但具體由誰來處理,則由執行時的狀態來決定。例如使用責任鏈模式可以實現有序廣播。
九、直譯器模式
用於對xml等檔案的解析,對某種語法規則下的語句的解釋,如數字表達式的解釋。
十、命令模式
將行為的呼叫者與實現者解耦,用於行為實現較為複雜,且需要對行為的實現過程進行日誌記錄或者撤銷等行為的情況。
十一、觀察者模式
應用於多個物件之間存在相互依賴關係的情況,其中的一個物件狀態的變化會引起其他物件行為或狀態的變化。可以使用JDK中的observer,observable介面方便實現。listView的viewAdapter就是觀察者模式的典型例子。
但是目前當多個部件之間存在相互聯絡時,可以使用EventBus來實現部件之間的相互關聯,十分方便。
十二、備忘錄模式
用於儲存物件當前的狀態,並在之後可以恢復到這些狀態。比如遊戲的存檔和讀盤操作就是備忘錄模式的很好的例子。
十三、迭代器模式
給使用者提供一個方便的方法去遍歷容器中的每一個物件。也就是在容器和使用者之間插入一個第三者。現在的List的子類都包含了迭代器。
十四、模板方法模式
定義一個操作中演算法的框架,而將一些具體的步驟的實現延遲到子類中,使得子類可以不改變演算法的結構,即可重新定義該演算法的某些具體的步驟。使用Asynctask程式設計時,doInBackground和onPreExecute等方法的具體實現就模板方法的很好的例子。在實現中,可以使用抽象類中定義方法,然後在具體實現類中實現的方法進行。
十五、訪問者模式
將資料操作與資料結構分離。適用於資料結構相對穩定,資料操作經常變化的資料操作類應用。
十六、中介者模式
用於協調多個物件之間的互動,將多物件之間多對多的關係變為中介者與多個物件之間一對多的關係。如用電腦的主機板來協調CPU、記憶體等多個裝置之間的關係。在一般程式設計中,介面上有不同的顯示元素,此時Activity就充當了中介者這個角色來協調各個顯示元素之間的關係。
十七、代理模式
為其他物件提供一種代理,以控制對這個物件的訪問。真實物件將方法的執行委託給代理物件。android中的AIDL就是一種代理模式。在程式設計過程中遠端資料訪問時,列表僅僅需要概要資訊,當用戶點選列表中的某一條時才顯示該條的詳細資訊,這就是典型的遠端代理模式應用場景。
十八、組合模式
這是一種結構型模式,告訴你一種組織物件的方式。即,一組相似的物件,能夠形成部分與整體的層次結構,將其作為一個物件來處理。用樹狀的結構來組合這些物件,並提供統一的訪問介面。如View和ViewGroup/作業系統中的檔案系統都是使用的組合模式。
十九、介面卡模式
用於不相容型別的轉換。listView中的adapter就是對資料庫資料與頁面顯示資料實現一個轉換,其就是介面卡模式的一個例子。
二十、裝飾模式
用於需要動態透明地拓展類的功能的情況。
二十一、享元模式
用於對大量相似物件的訪問,其採用構建緩衝池的方式,減少了記憶體中相似物件的屬相,提高了效能。就是把已經建立的物件快取起來,使用者下次請求相似物件時,直接給使用者,而不是重建這個物件。
二十二、外觀模式
多個複雜的子系統形成一個大系統,大系統對外提供統一簡單介面,系統內部的變化不會影響使用者對該大系統的使用。
二十三、橋接模式
一個類存在兩個獨立變化的維度,或者任何多維度變化的類,且在這些變化的維度上都需要進行拓展時,適用於該模式。比如衝咖啡就包涵大杯還是小杯,以及加糖不加糖這兩個不同的維度,就可以使用橋接模式。實際程式設計中,系統提供的操作相機的Camera、播放視訊的MediaPlayer等都是橋接模式,這些API類為我們操作底層硬體提供了可能。
這個類就是我們要控制的其中一個維度,另一個維度在另一個類裡實現,並在這個類中儲存另一個維度的引用,以此來實現橋接模式。
二十四、MVP架構模式
使用P來連線M和V,減少了M與V的耦合。