前言:每天学习自己不懂的知识点,就意味着你每天在进步
模板方法模式很简单的,说白了就是抽取共同的属性,不同的让子类去实现,现在看下百度百科对这模式的定义:
定义:
是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分
小明是刚毕业的大学生,入职到一家软件公司,上班第一周,主管给他一个任务,就是设计一个模块,让公司所有技术人员正常上班的工作任务,包括上班打卡,每个开发人员的工作任务,解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() { } }小明还把类图画出来了:
主管看了看,表扬了小明,做的还不错,但是主管说了说如果能把代码可读性再提高点就知道了,毕竟是很多技术人员一起开发,不是每个人都能一眼就能看的懂其中的意思,可以再封装下,小明想了想,我都用类去封装了,于是小明想到了干脆把这些逻辑整理成一个方法,起一个容易看懂的名字,叫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()二个方法!
最终的类图是这样的:
我们发现clock()和goHome()这二个方法是每个技术人员共有的,所以不需要去修改,哪怎么样防止子类去覆盖这些方法呢,我们只要把clock()和goHome()在方法上用final修饰即可,这样:
//下班 public final void goHome(){ System.out.print("做车回家"); } //打卡 public final void clock(){ System.out.print("打开上班"); }这样就相当于把一些不变的步骤给封装死了,变化的部分让子类去自己实现!
模板方法就是使用到了java面向对象的继承特征,比较简单就讲到这里了!从此小明开始了往java大牛方向一步步努力了!