模板方法设计模式

         
           模板方法设计模式
        
    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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值