一、模式定义
模板方法模式就是在一个抽象类中定义一些骨架方法,然后通过类继承的方法,将一些方法延迟到继承类里。模板方法模式是一种类行为型模式,是一种比较常用的方法。不属于对象行为型模式,因为只是通过类继承实现。
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.
二、模式角色
- AbstractClass(抽象类)
- ConcreteClass(实现类)
三、模式分析
模板方法,将基本方法封装组合在一个抽象类中形成一个总算法或者说一个总行为的方法。
模板方法的组成部分:
- 抽象方法(Abstract Method)
- 具体方法(Concrete Method)
- 钩子方法(HookMethod)
抽象类代码:
代码语言:javascript复制public abstract class AbstractClass
{
public void templateMethod() //模板方法
{
primitiveOperation1();
primitiveOperation2();
primitiveOperation3();
}
public void operation1() //基本方法-具体方法
{
//实现代码
}
public abstract void operation2(); //基本方法-抽象方法
public void operation3() //基本方法-钩子方法
{
}
}
具体实现类代码:
代码语言:javascript复制public abstract class ConcreteClass
{
/**
* 基本方法-抽象方法
*/
public abstract void operation2(){
//具体实现
}
/**
* 基本方法-钩子方法
*/
public void operation3(){
//具体实现
}
}
子类不显性调用父类的方法,而是通过继承的方法来实现具体的业务方法,也就是说父类控制子类的调用,这种机制叫好莱坞原则。好莱坞原则的定义为:“不要给我们打电话,我们会给你打电话(Don‘t call us, we’ll call you)”。
四、具体例子
数据库操作的例子。数据库操作分为连接、打开、使用、关闭步骤。现在要使用mysql、oracle、db2等等关系型数据库进行数据库操作工具类的编写。而对于使用这几种不同的数据库,其实只是连接的代码不同,而其它操作的代码都是差不多的,所以可以使用模板方法进行代码复用。
ps:这个例子来自《设计模式》一书,稍微改了一点
模板方法
代码语言:javascript复制public abstract class DBOperator
{
//抽象方法
public abstract void connDB();
public void openDB()
{
System.out.println("打开数据库");
}
public void useDB()
{
System.out.println("使用数据库");
}
public void closeDB()
{
System.out.println("关闭数据库");
}
//模板方法
public void process()
{
connDB();
openDB();
useDB();
closeDB();
}
}
mysql数据库
代码语言:javascript复制public class DBOperatorMysql extends DBOperator
{
public void connDB()
{
System.out.println("使用JDBC-ODBC桥接连接Mysql数据库");
}
}
Oracle数据库
代码语言:javascript复制public class DBOperatorOracle extends DBOperator
{
public void connDB()
{
System.out.println("使用JDBC-ODBC桥接连接Oracle数据库");
}
}
调用
代码语言:javascript复制class Client
{
public static void main(String a[])
{
DBOperator db1;
db1=new DBOperatorMysql();
db1.process();
db1=new DBOperatorOracle();
db1.process();
}
}
五、模式应用场景
- Spring、Struts2框架的应用,比如框架的初始化就有应用 …