android框架基础之模板方法模式

前言:每天学习自己不懂的知识点,就意味着你每天在进步


模板方法模式很简单的,说白了就是抽取共同的属性,不同的让子类去实现,现在看下百度百科对这模式的定义:

定义:

是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分


小明是刚毕业的大学生,入职到一家软件公司,上班第一周,主管给他一个任务,就是设计一个模块,让公司所有技术人员正常上班的工作任务,包括上班打卡,每个开发人员的工作任务,解bug,提交任务到svn或者git,然后下班,这一般是搞技术人一天忙的事,小明看到这个需求很简单啊,公司目前开发人员有做android,ios,php,java,前端,于是小明打开eclipse就是一顿干,干的热火朝天,写了如下几个类

java工程师

package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class JavaEngineer {
    //打卡
    public void clock(){

    }
    //每天的任务
    public void task(){

    }
    //提交任务
    public void commitTask(){

    }
    //下班
    public void goHome(){

    }
}
php工程师
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class PhpEngineer {
    //打卡
    public void clock(){

    }
    //每天的任务
    public void task(){

    }
    //提交任务
    public void commitTask(){

    }
    //下班
    public void goHome(){

    }
}
Java工程师
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class JavaEngineer {
    //打卡
    public void clock(){

    }
    //每天的任务
    public void task(){

    }
    //提交任务
    public void commitTask(){

    }
    //下班
    public void goHome(){

    }
}
小明把主框架搭建起来了,于是给主管看,主管看了看说,小明啊,这代码复用性不高啊,也就是说重复的代码不能被利用,小明听了主管的话,马上回去改,心想java面向对象的三大特征之一封装,小明顿时恍然大悟,小明这么想,php工程师,java工程师,android工程师都是工程师么,我把这三个工程师共性的行为抽取出来一个放在父类中,这个父类就是工程师,把打卡和下班的行为封装在父类中即可,因为这是共性的行为,但是每个工程师的任务和提交到管理平台肯定不一样啊,小明想哪就让这个父类是抽象的吧,每个子类去实现不同的功能即可!
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public abstract class Engineer {
    //打卡
    public void clock(){

    }
    //每天的任务
    public abstract void task();
    //提交任务
    public abstract void commitTask();
    //下班
    public void goHome(){

    }
}
java工程师:
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class JavaEngineer extends Engineer {
    @Override
    public void task() {
        
    }
    @Override
    public void commitTask() {

    }
}
php工程
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class PhpEngineer extends Engineer {
    @Override
    public void task() {
        
    }
    @Override
    public void commitTask() {

    }
}
android工程师
package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public class AndrodEngineer extends Engineer {
    @Override
    public void task() {
        
    }
    @Override
    public void commitTask() {

    }
}
小明还把类图画出来了:

android框架基础之模板方法模式_第1张图片

主管看了看,表扬了小明,做的还不错,但是主管说了说如果能把代码可读性再提高点就知道了,毕竟是很多技术人员一起开发,不是每个人都能一眼就能看的懂其中的意思,可以再封装下,小明想了想,我都用类去封装了,于是小明想到了干脆把这些逻辑整理成一个方法,起一个容易看懂的名字,叫work()吧,

package com.generic;
/**
 * Created by admin on 2017/2/4.
 */
public abstract class Engineer {
    public void work(){
        clock();
        task();
        commitTask();
        goHome();
    }
    //打卡
    public void clock(){
        System.out.print("打开上班");
    }
    //每天的任务
    public abstract void task();
    //提交任务
    public abstract void commitTask();
    //下班
    public void goHome(){
        System.out.print("做车回家");
    }
}
这个work就相当于是每个技术人员每天的工作流程了,只要按照这个流程走就ok,这样无形中就形成了一个规则,现在我们再对开始的定义结合代码看下:

是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分

我们看到上面的红色文字是说明定义了一个算法的执行步骤,对应我们的代码就是work()方法就是算法,步骤就是上面依次哪四个方法,默认的实现就是clock()和goHome(),并且定义一些步骤让子类来实现,这句话的意思就是我们在上面的代码中task()和commitTask()二个方法!

最终的类图是这样的:

android框架基础之模板方法模式_第2张图片

我们发现clock()和goHome()这二个方法是每个技术人员共有的,所以不需要去修改,哪怎么样防止子类去覆盖这些方法呢,我们只要把clock()和goHome()在方法上用final修饰即可,这样:

//下班
public final void goHome(){
    System.out.print("做车回家");
}
//打卡
public final void clock(){
    System.out.print("打开上班");
}
这样就相当于把一些不变的步骤给封装死了,变化的部分让子类去自己实现!

模板方法就是使用到了java面向对象的继承特征,比较简单就讲到这里了!从此小明开始了往java大牛方向一步步努力了!

你可能感兴趣的:(架构之路)