template模式主要是将不变化的方法放在父类中,再声明一个抽象方法,子类通过实现该抽象方法,达到封装变化的作用.
其实android也大量的使用template模式,比如view:
、
下面用代码示例:
public class TemplateActivity extends Activity implements OnClickListener ,OnFocusChangeListener{
public static final String TITLE = "title";
@Override
public void setTitle(int titleId) {
super.setTitle(titleId);
}
private MyButton mButton;
private MyView mView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.entry);
findComponent();
setOnClickListener();
setOnFocusChangeListener();
}
private void setOnClickListener() {
mButton.setOnClickListener(this);
mView.setOnClickListener(this);
}
private void setOnFocusChangeListener() {
mButton.setOnFocusChangeListener(this);
mView.setOnFocusChangeListener(this);
}
private void findComponent() {
mButton = (MyButton) this.findViewById(R.id.btn);
mView=(MyView) this.findViewById(R.id.view);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn:
DebugLog.log("btn onclick");
break;
case R.id.view:
DebugLog.log("view onclick");
break;
default:
break;
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
int id = v.getId();
switch (id) {
case R.id.btn:
DebugLog.log("btn onFocusChange");
break;
case R.id.view:
DebugLog.log("view onFocusChange");
break;
default:
break;
}
}
}
public class DebugLog {
public final static boolean DEBUG = true;
public static void log(String message) {
if (DEBUG) {
String fullClassName = Thread.currentThread().getStackTrace()[3].getClassName();
String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
int lineNumber = Thread.currentThread().getStackTrace()[3].getLineNumber();
Log.d(className + "." + methodName + "():" + lineNumber, message);
}
}
public static void printThreadId(String message) {
if (DEBUG) {
Log.d(message, String.valueOf(Thread.currentThread().getId()));
}
}
public static void log(String tag, String message) {
if (DEBUG) {
String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
int lineNumber = Thread.currentThread().getStackTrace()[3].getLineNumber();
Log.d(tag + "." + methodName + "():" + lineNumber, message);
}
}
public static void printTrace(String message) {
if (DEBUG) {
printIllegalArgumentException("", message);
}
}
public static String getStackTrace(Throwable throwable) {
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
throwable.printStackTrace(printWriter);
return writer.toString();
}
public static void printIllegalArgumentException(String tag, String arg) {
if (DEBUG) {
final Throwable throwable = new IllegalArgumentException(arg);
Log.w(tag, arg, throwable);
}
}
}
public class MyView extends View { public MyView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setARGB(255, 255, 0, 0); canvas.drawCircle(100, 100, 100, paint); super.onDraw(canvas); } public MyView(Context context) { super(context); } }
public class MyButton extends Button { public MyButton(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setARGB(255, 255, 0, 0); canvas.drawCircle(100, 100, 100, paint); super.onDraw(canvas); } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } }<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.fp.app.view.MyButton android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="click me my button" />
<com.fp.app.view.MyView android:id="@+id/view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=" click me my view" />
</LinearLayout>