java模版方法

模版方法就是建立一个类,在这个类中封装了所有的公共实现的部分,而对有不同实现方式的部分使用抽象的定义,具体的实现交给继承与此类的子类来实现,这是基于继承的实现的模版方法模式:

定义一个抽象的模块:

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);
    }
}

原文地址:https://www.cnblogs.com/charleszhang1988/p/3059572.html