模板方法设计模式
1.定义一个操作中的算法的框架,而将一些步骤延迟到子类中,
使得子类可以改变一个算法的结构即可重定义该算法的某些特定的步骤。
2.具体实现:
package com.njtc.edu.template;
public abstract class Worker
{
protected String name;
public Worker(String name)
{
this.name = name;
}
/**
* 记录一天的工作
*/
public final void workOneDay()
{
System.out.println("-----------------work start ---------------");
enterCompany();
computerOn();
work();
computerOff();
exitCompany();
System.out.println("-----------------work end ---------------");
}
/**
* 工作
*/
public abstract void work();
/**
* 关闭电脑
*/
private void computerOff()
{
System.out.println(name + "关闭电脑");
}
/**
* 打开电脑
*/
private void computerOn()
{
System.out.println(name + "打开电脑");
}
/**
* 进入公司
*/
public void enterCompany()
{
System.out.println(name + "进入公司");
}
/**
* 离开公司
*/
public void exitCompany()
{
System.out.println(name + "离开公司");
}
}
定义了一个上班(算法)的骨架,包含以下步骤:
a、进入公司
b、打开电脑
c、上班情况
d、关闭电脑
e、离开公司
可以看到,a、b、d、e我们在超类中已经实现,子类仅实现work这个抽象方法,
记录每天的上班情况。下面各类屌丝入场:
程序猿:
package com.njtc.edu.template;
public class ITWorker extends Worker
{
public ITWorker(String name)
{
super(name);
}
@Override
public void work()
{
System.out.println(name + "写程序-测bug-fix bug");
}
}
HR:
package com.njtc.edu.template;
public class HRWorker extends Worker
{
public HRWorker(String name)
{
super(name);
}
@Override
public void work()
{
System.out.println(name + "看简历-打电话-接电话");
}
}
测试人员:
package com.njtc.edu.template;
public class QAWorker extends Worker
{
public QAWorker(String name)
{
super(name);
}
@Override
public void work()
{
System.out.println(name + "写测试用例-提交bug-写测试用例");
}
3.模板方法设计模式的优点:
1.封装不变部分,扩展可变部分。
2.提取公共部分代码便于维护。
3.行为由父类控制子类实现。
4. 实例: 手指滑动屏幕,切换页面。
package com.njtc.edu.zhmmobilesafe;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public abstract class BaseActivity extends Activity {
private GestureDetector gd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gd = new GestureDetector(this, new SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
//屏蔽在斜着划动
if(Math.abs(e2.getRawY() - e1.getRawY())>100){
Toast.makeText(BaseActivity.this,"不能这样滑动", 0).show();
return true;
}
//屏蔽滑动X滑动很慢的情形;
// velocityX 在x方向滑动的速度: px/s
if(Math.abs(velocityX)<200){
Toast.makeText(BaseActivity.this,"滑动得太慢了!", 0).show();
return true;
}
//滑动到上一个页面
if((e1.getRawX() - e2.getRawX())>200 ){
System.out.println("显示下一页面,从左往右滑动!");
moveToNext();
}
// 滑动到上一个页面
if((e2.getRawX() - e1.getRawX())>200 ){
moveToPre();
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
// 进入下一个页面
public abstract void moveToNext();
// 进入上一个页面
public abstract void moveToPre();
// 上一页的点击事件
public void next(View view){
moveToNext();
}
//上一页的点击事件
public void previous(View view){
moveToPre();
}
// 将浮动事件传递给手势识别器
@Override
public boolean onTouchEvent(MotionEvent event) {
gd.onTouchEvent(event);
return super.onTouchEvent(event);
}
}