1、綜述
設計模式,根據前人經驗總結出常見軟件工程問題的解決思想套路。GoF一共概括了23種設計模式,固然還有人擴充,不止這些。
設計模式主要利用面嚮對象語言的特性,而android 的設計主要用JAVA語言,有不少地方用到設計模式。android
2、設計原則
設計模式是遵循面向對象設計的五個設計原則來設計的,以下:
1.單一職責原則(SRP)--一個類只能有一個職責,多個職責耦合在一塊兒,會影響複用性。
2.開放封閉原則(OCP)--對擴展是開放的,而對修改是封閉的
3.Liskov替換原則(LSP)--繼承必須確保超類所擁有的性質在子類中仍然成立
4.依賴倒置原則(DIP)--高層次的模塊不該該依賴於低層次的模塊,他們都應該依賴於抽象;抽象不該該依賴於具體,具體應該依賴於抽象。
5.接口隔離原則(ISP)--使用多個專門的接口比使用單一的總接口要好。算法
3、常見設計模式
一、單例模式
最簡單的設計模式,避免在內存中頻繁的實例化因此將它的對象寫成static 靜態 這樣它的對象就只有一份存在靜態內存區使用的時候只需要經過
getInstance()就能夠直接拿到這個靜態對象。經常使用到的好比數據庫管理類DatabaseHelper和輸入法管理類InputMethodManager。數據庫
1 //餓漢式 2 class Singleton { 3 private static Singleton instance=new Singleton(); 4 private Singleton(){} 5 static Singleton getInstance() { 6 return instance; 7 } 8 } 9 10 //懶漢式 11 class Singleton { 12 private static Singleton instance=null; 13 private Singleton(){} 14 static Singleton getInstance() { 15 if(instance==null) 16 instance=new Singleton(); 17 return instance; 18 } 19 }
餓漢式是線程安全的,懶漢式是線程不安全的,若是要考慮線程,能夠同步代碼塊也能夠同步方法,同步代碼塊是最好的方法canvas
二、模板方法設計模式
經過把不變的的行爲搬移到超類,去除子類中重複的代碼來體現它的優點;當不變的和可變的行爲在子類實現中混合在一塊兒的時候,
不變的行爲就會在子類中重複實現,咱們經過模板方法模式把這些行爲搬移到單一的地方,這樣就能夠幫助子類擺脫重複不變行爲的糾纏。經常使用到的好比View的Draw方法。安全
若是咱們自定義View的話,咱們通常也是重寫onDraw方法便可。ide
1 public class View{ 2 /** 3 * 鉤子操做,空實現 4 */ 5 protected void onDraw(Canvas canvas) { 6 } 7 8 /** 9 *鉤子操做,空實現 10 */ 11 protected void dispatchDraw(Canvas canvas) { 12 } 13 14 //算法骨架 15 public void draw(Canvas canvas) { 16 if (!verticalEdges && !horizontalEdges) { 17 // 步驟1 18 if (!dirtyOpaque) onDraw(canvas); 19 20 // 步驟2 21 dispatchDraw(canvas); 22 23 // 步驟3 24 onDrawScrollBars(canvas); 25 26 return; 27 } 28 } 29 //... ... 30 } 31 32 public class TextView{ 33 @Override 34 protected void onDraw(Canvas canvas) { 35 //大量自定義實現代碼 36 } 37 }
三、建造者模式
將一個複雜對象的構造與它的表示分離,使一樣的構建過程能夠建立不一樣的表示,這樣的設計模式被稱爲建造者模式。
上文講到Dialog主要用到建造者模式。AlertDialog.Builder就是具體建造者,另外,它是以匿名類的方式被建立的,並且,
Builder類是AlertDialog的內部類,這樣,耦合性比較低,這正是面向對象中要達到的設計意圖之一。 最後調用show函數,
它的返回類型正是咱們要建立的產品,即AlertDialog。 因此,Builder(具體建造者)是AlertDialog(產品)的內部匿名類,用來建立並顯示一個dialog。函數
四、適配器模式
把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來不匹配而沒法在一塊兒工做的兩個,類可以在一塊兒工做。
適配器模式分爲類適配器模式和對象適配器模式。ListView用於顯示列表數據,可是做爲列表數據集合有不少形式,
有Array,有Cursor,咱們須要對應的適配器做爲橋樑,處理相應的數據(並能造成ListView所須要的視圖)ui
五、觀察者模式
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。
在ListView中Adapter中favoritesAdapter.registerDataSetObserver(mDataSetObserver);;數據改變以後會自動調用。spa
六、and so on