君临-行者无界

导航

模板方法

  模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。

  在java中,可以这样理解,有一个抽象父类,这个抽象类中有一个基本方法method和一些抽象方法,在method中按一定的逻辑调用了类中其它的方法(包括抽象方法)来实现特定的功能,这个时候method还不能正常工作,需要有子类去继承这个抽象父类,并实现父类中的抽象方法。

  我们以java操作数据库为例,总共可以分为6个步骤:1、注册驱动 2、获取连接对象 3、创建 Statement对象 4、执行sql 5、处理结果 6、关闭资源,针对同一个数据库并且sql类型也一样的情况下(例如select),这六个步骤中只有第三步是可变的,并且整个的执行顺序不能变,这个时候我们就可以使用模板方法,类图很简单,就不画了。代码如下

  模板类

package io.powerx.template;

public abstract class MyJdbcTemplate {

    protected final Object curd(String sql) {
        registryDriver();
        getConnection();
        getStatement(sql);
        Object o =  exesql();
        processResult();
        classSource();
        return o;
    }
    
    private void registryDriver() {
        System.out.println("注册驱动");
    }
    private void getConnection() {
        System.out.println("获取连接对象");
    }
    
    protected abstract void getStatement(String sql) ;
    
    private Object exesql() {
        System.out.println("执行sql");
        return "";
    }
    
    private void processResult() {
        System.out.println("处理结果");
    }
    
    private void classSource() {
        System.out.println("关闭资源");
    }
}

  dao类

package io.powerx.template;

public class MyDao extends MyJdbcTemplate{

    @Override
    protected void getStatement(String sql) {
        System.out.println("获取"+sql+"的statement");
    }
    public Object select(String sql) {
        return curd(sql);
    }
}

  调用类

package io.powerx.template;

public class Client {

    public static void main(String[] args) {
        MyDao mydao = new MyDao();
        mydao.select("select * from user");
    }
}

  通过使用模板方法,我们在做查询操作时,只需要传入sql即可,不需要去关注整个操作流程。我们日常开发中遇到的回调方法、钩子(钩子就是给子类一个授权,允许子类通过重写钩子方法来颠覆基本逻辑的执行,这有时候是非常有用的)及spring data 家族中的各种template都是模板方法的应用。

  模板模式的关键点:

  1、使用抽象类定义模板类,并在其中定义所有的基本方法、模板方法,钩子方法,不限数量,以实现功能逻辑为主。其中基本方法使用final修饰,其中要调用基本方法和钩子方法,基本方法和钩子方法可以使用protected修饰,表明可被子类修改。

  2、定义实现抽象类的子类,重写其中的模板方法,甚至钩子方法,完善具体的逻辑。

  适用场景:

  1、在多个子类中拥有相同的方法,而且逻辑相同时,可以将这些方法抽出来放到一个模板抽象类中。

  2、程序主框架相同,细节不同的情况下,也可以使用模板方法。

posted on 2019-01-10 15:32  请叫我西毒  阅读(212)  评论(0编辑  收藏  举报