Android系統是一個優秀的應用程式架構,在架構中設計模式有著廣泛的應用。當然Android也不會例外,本文只是簡單以View類為例來說明Template method模式在Android中的應用。
首先我們溫習一下Template method模式。模板方法模式作用是:在基類中定義好演算法和流程。具體的實現延遲到衍生類別中定義。其UML圖如下:
從我們可以看出在AbstractClass中定義好了TemplateMethod方法,這個方法中定義好了對PrimitiveOperation方法的調用,但是在AbstractClass中把PrimitiveOperation方法定義成了抽象方法,沒有實現,所以這個方法也只能是一個模板,不能調用。這樣當定義ConcreteClass的時候,需要定義PrimitiveOperation方法,這樣AbstractClass中的TemplateMethod方法中定義的邏輯就可以正確運行了。
我通過上面的描述我們可以知道,模板方法這個模式在架構中肯定會有很廣泛的應用。這個模式可以對應成邏輯流程在架構中定義,具體實現有使用者自己定義。
下面我以Android架構中的View類為例來介紹一下,這個模式在Android中的應用。
1、我們建立一個helloview工程。
2、增加一個MyView類,代碼如下:
package com.simon.helloview;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.view.View;public class MyView extends View {public MyView(Context context) {super(context);}protected void onDraw (Canvas canvas) {Paint paint = new Paint();paint.setARGB(255, 255, 0, 0);canvas.drawCircle(100, 100, 100, paint);}}
3、定義HelloViewActivity代碼如下:
package com.simon.helloview;import android.app.Activity;import android.os.Bundle;public class HelloViewActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); }}
這個例子中,MyView實現了基類View的onDraw方法,該方法是protected,不能被使用者調用的。那麼誰會調用這個方法呢?如果你仔細研究一下View.java的代碼,你就會發現在View的draw方法中調用了onDraw方法。邏輯如下:
public void draw(Canvas canvas) { ....... onDraw(canvas); .......}
由此可見基類View中已經定義好了模板方法,所以衍生類別中只需要定義onDraw方法在視窗上面畫怎麼畫就可以了。使用者調用view對象的模板方法draw方法來繪製視窗。
在Android模板方法有這個很廣泛的應用,基本上隨處可見。在比如Activity類的onCreate,onStart等方法,都是在基類定義好了模板方法,而這些方法可以理解成衍生類別具體實現。當在適當條件下,基類根據自己的邏輯調用基類中的這些方法。
我們在做軟體的過程中,要多以設計模式的眼光來研究問題,分析問題,對我們分析問題的能力會有一個比較大的提高。