zoukankan      html  css  js  c++  java
  • 模板方法

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

      在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、程序主框架相同,细节不同的情况下,也可以使用模板方法。

  • 相关阅读:
    09-JS的事件流的概念(重点)
    08-jQuery的位置信息
    07-小米导航案例
    python-selector模块
    python--day9--异步IO、数据库、队列、缓存
    python--select多路复用socket
    python--gevent高并发socket
    python--协程
    python--进程锁、进程池
    python--多进程
  • 原文地址:https://www.cnblogs.com/hhhshct/p/10250280.html
Copyright © 2011-2022 走看看