標籤:
組合模式
Android中對組合模式的應用,可謂是泛濫成粥,隨處可見,那就是View和ViewGroup類的使用。在android UI設計,幾乎所有的widget和布局類都依靠這兩個類。
組合模式,Composite Pattern,是一個非常巧妙的模式。幾乎所有的物件導向系統都應用到了組合模式。
將對象View和ViewGroup組合成樹形結構以表示”部分-整體”的階層(View可以做為ViewGroup的一部分)。
組合模式使得使用者對單個對象View和組合對象ViewGroup的使用具有一致性。
建造者模式
在Android中經常要使用AlertDialog來顯示一些簡單的視窗,通常的寫法類似下面的代碼 :
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("提示") .setMessage("確定退出?").create(); dialog.show();
可以看到dialog是通過Builder建立的,那麼Builder是如何同AlertDialog協同工作的呢?其實AlertDialog的建立就是使用Builder模式,廢話不多說,直接上代碼吧。
備忘錄模式
Activity的onSaveInstanceState和onRestoreInstanceState就是通過Bundle這種序列化的資料結構來儲存Activity的狀態。以便可以恢複Activity在onDestory之前儲存的資訊。
狀態模式
View.onVisibilityChanged方法,就是提供了一個狀態模式的實現,允許在View的visibility發生改變時,引發執行onVisibilityChanged方法中的動作。比如View的GONE,VISIBLE狀態發生改變時,行為改變。
單例模式
android中有很多系統層級的全域變數,如時間,IME,賬戶,狀態列等等,android中對這些都直接或者有些間接用到了單例模式。
觀察者模式
在Android中,最典型的觀察者模式就是”廣播“。
(1)TimelineReceiver是觀察者;
(2)重寫OnReceive方法,來定義當收到狀態變化時,訂閱者的行為;
class TimelineReceiver extends BroadcastReceiver { // 1 @Override public void onReceive(Context context, Intent intent) { // 2 cursor.requery(); // 3 adapter.notifyDataSetChanged(); // 4 Log.d("TimelineReceiver", "onReceived"); } }
命令模式
android中用到許多多線程多進程,所以必然大量使用到Runbable,Thread。其實用的就是最簡單的命令模式。
public interface Runnable { public abstract void run();}
調用者Thread簡化版代碼:
//命令模式這裡不需要繼承Runnable介面,但是這裡考慮到實際情況,比如方便性等,繼承了Runnable介面,實現了run方法,這個是Thread自身的運行run的方法class Thread implements Runnable { private Runnable target; public Thread(Runnable target) { this.target = target; } public synchronized void start() { if (threadStatus != 0 || this != me) throw new IllegalThreadStateException(); group.add(this); start0();//這個是本地方法,調用run方法 if (stopBeforeStart) { stop0(throwableFromStop); } } //可選 public void run() { if (target != null) { target.run(); } }}
用戶端只需要new Thread(new Runnable(){}).start()就開始執行相關的一系列的請求,這些請求大部分都是實現Runnable介面的匿名類。
中介者模式
如Resource.getDrawable方法的實現邏輯是這樣的:建立一個緩衝來存放所有已經載入過的,如果getDrawable中傳入的id所對應的Drawable以前沒有被載入過,那麼它就會根據id所對應的資源類型,分別調用XML解析器產生,或者通過讀取包中的圖片資源檔來建立Drawable。
而Resource.getDrawable把涉及到多個對象、多個邏輯的操作封裝成一個方法,就實現了一個調解者的角色。
代理模式
假設一個Activity A去綁定一個Service S,那麼A調用S中的每一個方法其實都是通過系統的Binder機制的中轉,然後調用S中的對應方法來做到的。Binder機制就起到了代理的作用。
適配器模式
對於android開發人員來說起,適配器模式簡直太熟悉不過,有很多應用可以說是天天在直接或者間接的用到適配器模式,比如ListView。
ListView用於顯示列表資料,但是作為列表資料集合有很多形式,有Array,有Cursor,我們需要對應的適配器作為橋樑,處理相應的資料(並能形成ListView所需要的視圖)。
正是因為定義了這些適配器介面和適配器類,才能使我們的資料簡單靈活而又正確的顯示到了adapterview的實作類別上。
Android:Android涉及到的設計模式