C10) Template(模板模式)
定义:定义一个操作的算法的框架,将一些步骤的实现推迟到子类。模板模式在不改变算法结构的前提下,允许子类重定义算法的某些步骤。
模板模式非常好的利用了继承重载的特性,先给出操作要实现的步骤大纲,暂缓某些步骤的实现,把这部分交由不同的子类来完成。这个模式就像平时常做的填写表格,表格就是模板,每张填写好的表格都是这个模板的一个子类。
现在假设要实现一个数据复制的功能,我们将这个功能分为几个步骤:1)打开数据源和目标 3)读取数据 4)数据格式化 5)写入数据 6)关闭,生成模板类如下
public abstract class CopyTemplate {
public abstract void open();
public abstract void getData();
public abstract void formatData();
public abstract void putData();
public abstract void close();
public void doCopy() {
open();
getData();
formatData();
putData();
close();
}
}
接下来,需要实现一个从数据库复制到文件的功能
public class DB2File extends CopyTemplate {
public void open() {
//建立数据库连接
//创建文件访问对象
}
public void getData() {
//查询操作,取得ResultSet
}
public void formatData() {
//格式化数据
}
public void putData() {
//写文件
}
public void close() {
//关闭数据库连接
//关闭文件访问对象
}
}
如果需要文件向数据库复制
public class File2DB extends CopyTemplate {
public void open() {
//建立数据库连接
//创建文件访问对象
}
public void getData() {
//读文件
}
public void formatData() {
//格式化数据
}
public void putData() {
//生成InsertQuery并执行
}
public void close() {
//关闭数据库连接
//关闭文件访问对象
}
}
调用的时候
CopyTemplate action1 = new DB2File();
action1.doCopy();
CopyTemplate action2 = new File2DB();
action2.doCopy();
上面模板用到了抽象类,主要是为了强制子类实现。对于doCopy()方法,可以加上final关键字声明,这样子类就无法重载了。
参考:
1、 http://www.jdon.com/designpatterns/template.htm(中文、java实例)
2、 http://www.dofactory.com/Patterns/PatternCommand.aspx(英文、C#实例、UML)
3、 http://www.caterpillar.onlyfun.net/PmWiki/pmwiki.php/DesignPattern/TemplateMethod(中文、java实例、UML)推荐
4、 http://www.techscore.com/tech/DesignPattern/TemplateMethod.html(日文、java实例、UML)推荐
联系客服