模板设计模式是通过抽象类来实现的,该抽象类的方法可以分为两大类:模板方法和基本方法。
模板方法
一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
基本方法
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
● 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。
● 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。
● 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
模板方法就是一个方法(通常为final,不允许子类进行覆盖),该方法包含了一个算法的各个步骤(每个步骤相当于一个方法),在模版方法内调用的方法中有抽象的(待子类覆盖),也有具体的。另外在模版方法所属类中可以包含一个钩子方法(hook),该方法可以控制模版方法中的逻辑,该方法提供默认的实现。子类不是必须实现它。下面给出一个具体的例子。
模版方法类:
/**
* 基于继承实现模板设计模式
* @author Administrator
*
*/
public abstract class MyJdbcTemplateByIn {
private void beginConnection() {
System.out.println("begin connection");
}
private void closeConnection() {
System.out.println("close connection");
}
public abstract void run();
/**
* 在模板设计模式中有一种函数叫做钩子函数,钩子函数的作用是让实现类可以通过一些方法来控制模板中的流程
* @return
*/
public boolean isLog(){return false;}
//模板方法
public final void execute() {
beginConnection();
if(isLog()) {
System.out.println("加入了日志");
}
run();
closeConnection();
}
}
不同的实现方法:
public class MessageDao extends MyJdbcTemplateByIn {
@Override
public void run() {
System.out.println("msg add");
}
@Override
public boolean isLog() {
return true;
}
}
public class RoleDao extends MyJdbcTemplateByIn {
@Override
public void run() {
System.out.println("role add");
}
}
测试方法:
public class TestTemplate {
@Test
public void test01() {
MyJdbcTemplateByIn mt = new RoleDao();
mt.execute();
MyJdbcTemplateByIn msgt = new MessageDao();
msgt.execute();
}
}
设计思想:
作为模板的方法定义在父类(父类为抽象类),而方法定义使用抽象方法,实现抽象方法的是子类,要在子类实现方法,才能决定具体的操作。如果在不同的子类执行不同实现就可以发展出不同的处理内容。不过,无论在哪个子类执行任何一种实现,处理的大致流程都还是要依照父类制定的方式。