zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 17-3 模板方法模式源码解析

    1    源码解析

    1.1    源码解析1(在jdk中的使用)

    1.2    源码解析2(在servlet中的应用)

    1.3    源码解析3(在mybaties中的应用)

    1    源码解析
    1.1    源码解析1(在jdk中的使用)

    AbstractList(父类

    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    
    //get方法为抽象方法,完全交给子类去实现
    
    abstract public E get(int index);
    
    }

    ArrayList(子类)

    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    {
    //子类来实现get方法
     public E get(int index) {
            rangeCheck(index);
    
            return elementData(index);
        }
    }

    同理:AbstractSet,AbstractMap同样采用了模版方法模式

    1.2    源码解析2(在servlet中的应用)

    HttpServlet

    public abstract class HttpServlet extends GenericServlet {
    /***
       *    doget方法,dopost方法,service方法
       *     httpServlet中定义了一套模版,我们使用的时候只要继承httpServlet,并且实现doget和dopost方法就可以了
       *     注意:权限是protected,也就是只有子类才能实现这些方法
       */
    
    //doget方法
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String protocol = req.getProtocol();
            String msg = lStrings.getString("http.method_get_not_supported");
            if (protocol.endsWith("1.1")) {
                resp.sendError(405, msg);
            } else {
                resp.sendError(400, msg);
            }
    
        }
    
    //dopost方法
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String protocol = req.getProtocol();
            String msg = lStrings.getString("http.method_post_not_supported");
            if (protocol.endsWith("1.1")) {
                resp.sendError(405, msg);
            } else {
                resp.sendError(400, msg);
            }
    
        }
    }
    1.3    源码解析3(在mybaties中的应用)

    uml类图:

    BaseExecutor(父类)

    public abstract class BaseExecutor implements Executor {
    //这是一个执行sql的类
    //其中有四个方法,重点看doUpdate方法,
    //它有四个子类,分别是在简单sql doupdate,复用sql doupdate,批量sql doupdate,等
    
       protected abstract int doUpdate(MappedStatement var1, Object var2) throws SQLException;
    
        protected abstract List<BatchResult> doFlushStatements(boolean var1) throws SQLException;
    
        protected abstract <E> List<E> doQuery(MappedStatement var1, Object var2, RowBounds var3, ResultHandler var4, BoundSql var5) throws SQLException;
    
        protected abstract <E> Cursor<E> doQueryCursor(MappedStatement var1, Object var2, RowBounds var3, BoundSql var4) throws SQLException;
    
    
    
    }

     

    子类BatchExecutor :

    public class BatchExecutor extends BaseExecutor {
      @Override
      public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
        final Configuration configuration = ms.getConfiguration();
        final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
        final BoundSql boundSql = handler.getBoundSql();
        final String sql = boundSql.getSql();
        final Statement stmt;
        if (sql.equals(currentSql) && ms.equals(currentStatement)) {
          int last = statementList.size() - 1;
          stmt = statementList.get(last);
          applyTransactionTimeout(stmt);
         handler.parameterize(stmt);//fix Issues 322
          BatchResult batchResult = batchResultList.get(last);
          batchResult.addParameterObject(parameterObject);
        } else {
          Connection connection = getConnection(ms.getStatementLog());
          stmt = handler.prepare(connection, transaction.getTimeout());
          handler.parameterize(stmt);    //fix Issues 322
          currentSql = sql;
          currentStatement = ms;
          statementList.add(stmt);
          batchResultList.add(new BatchResult(ms, sql, parameterObject));
        }
      // handler.parameterize(stmt);
        handler.batch(stmt);
        return BATCH_UPDATE_RETURN_VALUE;
      }
    
    }

    子类SimpleExecutor :

    public class SimpleExecutor extends BaseExecutor {
      @Override
      public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
        Statement stmt = null;
        try {
          Configuration configuration = ms.getConfiguration();
          StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
          stmt = prepareStatement(handler, ms.getStatementLog());
          return handler.update(stmt);
        } finally {
          closeStatement(stmt);
        }
      }
    }
  • 相关阅读:
    洛谷P3811题解
    洛谷P3353在你窗外闪耀的星星-题解
    Map根据value来排序
    java8 groupby count
    Java反射
    maven profile环境切换
    获取nginx代理情况下的真实ip
    获取request里header的name和value
    git 删除iml文件
    java list 排序
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/11562083.html
Copyright © 2011-2022 走看看