Template模式在Android中的使用

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>

原文地址:https://www.cnblogs.com/budoudou/p/2100946.html