我们首先看一下模板方法的定义:
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
我们定义一个抽象类WorkTemplate,该类中定义一个模板方法doWork()定义了一天上班的过程框架,同时提供了一些基本的方法,子类可以覆盖基本方法来实现自己的上班过程。
package com.templateMethod; public abstract class WorkTemplate { //定义的模板方法,定义了一个过程的框架 public void doWork(){ goToWork(); if(!isFestival()){ Work(); } goOffWork(); } //定义基本方法,是模板方法的组成部分 public abstract int goToWork();//抽象方法 public void Work(){//具体方法 System.out.println("正在干体力活"); } public abstract int goOffWork(); public boolean isFestival(){//hook method,钩子方法 return true; } }
下面我们提供两个实现类
package com.templateMethod; public class WorkTemplateImpl extends WorkTemplate{ @Override public int goToWork() { System.out.println("去上班。。。"); return 0; } @Override public void Work() { System.out.println("正在干活。。。"); } @Override public int goOffWork() { System.out.println("下班了。。。。"); return 0; } @Override public boolean isFestival() { // 默认是要干活的 return false; } }
package com.templateMethod; public class WorkTemplateImpl2 extends WorkTemplate{ @Override public int goToWork() { System.out.println("去上班。。。"); return 0; } @Override public int goOffWork() { System.out.println("下班了。。。。"); return 0; } @Override public boolean isFestival() { // TODO Auto-generated method stub return false; } }
测试类
package com.templateMethod; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub WorkTemplate template=new WorkTemplateImpl2(); template.doWork(); } }
模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系