模版方法就是建立一个类,在这个类中封装了所有的公共实现的部分,而对有不同实现方式的部分使用抽象的定义,具体的实现交给继承与此类的子类来实现,这是基于继承的实现的模版方法模式:
定义一个抽象的模块:
public abstract class Template {
private void openConnection(){
System.out.println("open a connection");
}
private void closeConnenction(){
System.out.println("close a connenction");
}
public abstract void run();
public void log(){
System.out.println("add log");
}
public abstract boolean isLog();
//模版方法,公用的方法有父类实现,有不同实现的的方法定义为抽象方法
//有该类的子类去完成具体的实现,而execute方法就像一个模块,规定了实现
//某个操作的先后顺序
public void execute(){
openConnection();
run();
if(isLog()){
log();
}
closeConnenction();
}
}
定义两个子类:
public class MyTemplate extends Template {
@Override
public void run() {
System.out.println("my run");
}
@Override
public boolean isLog() {
return false;
}
}
public class LogTemplate extends Template {
@Override
public void run() {
System.out.println("log run");
}
@Override
public boolean isLog() {
return true;
}
}
测试类:
public class TestTemplate {
@Test
public void testTemplate01(){
Template myTemplate = new MyTemplate();
Template logTemplate = new LogTemplate();
myTemplate.execute();
logTemplate.execute();
}
}
通过组合的方式实现模版方法:
定义一个模块类
public class Template {
private void openConnection(){
System.out.println("open a connection");
}
private void closeConnenction(){
System.out.println("close a connenction");
}
//传入一个实现了TemplateCallback接口的对象,该对象用于回调传入的对象
//的具体实现的方法
public void execute(TemplateCallback tcb){
openConnection();
tcb.doInTemplate();
closeConnenction();
}
//执行一个模版类的execute的模版方法,传入一个实现了TemplateCallback接口的对象
//在doInTemplate中可封装一个执行相同功能而参数不同的方法(比如传入不同的sql语句和
//不同的查询参数
public void add(final int id){
execute(new TemplateCallback(){
@Override
public void doInTemplate() {
System.out.println("add:"+ id);
}
});
}
public void delete(final int id){
execute(new TemplateCallback(){
@Override
public void doInTemplate() {
System.out.println("delete:" + id);
}
});
}
}
定义一个回调的接口类
public interface TemplateCallback {
public void doInTemplate();
}
定义一个客户端类
public class ClientTemplate {
//保持一个模版方法类的引用
private Template template = new Template();
public void add(int id){
//调用模块对象的方法并传递参数
template.add(id);
}
public void delete(int id){
template.delete(id);
}
}
测试类
public class TestTemplate {
@Test
public void testTemplateCombination(){
ClientTemplate ct = new ClientTemplate();
ct.add(3);
}
}