设计模式课程 设计模式精讲 15-3 桥接模式源码解析

1    桥接模式源码解析

1.1  源码解析1 jdk中的应用(驱动类)

1    桥接模式源码解析
1.1  源码解析1 jdk中的应用(驱动类)

步骤:

class.forName 调取驱动接口的静态块,触发驱动管理类DriverManager 的注册驱动方法,从而将该驱动放到CopyOnWriteArrayList中。

getConnect方法是通过传入url用户名密码。

针对不同的数据库,通过driverManager中的不同方法,获取的都是相同的接口,jdbc在最初的时候设计了一套接口,再由各个数据库公司实现这套接口。

重点:

实现(各种Driver如SqlDriver,OracleDriver等)和抽象(DriverManager的分离)分离

驱动接口:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
//class.forName 直接调用该静态块
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can‘t register driver!");
        }
    }
}

驱动实现类:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
}

DriverManager:

public class DriverManager {
    // List of registered JDBC drivers
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();
    private static volatile int loginTimeout = 0;
    private static volatile java.io.PrintWriter logWriter = null;
    private static volatile java.io.PrintStream logStream = null;
    // Used in println() to synchronize logWriter
    private final static  Object logSync = new Object();

    /* Prevent the DriverManager class from being instantiated. */
    private DriverManager(){}

 /**
    *内部类,对driver进行封装
    */
class DriverInfo {

    final Driver driver;
    DriverInfo(Driver driver) {
        this.driver = driver;
    }

    public boolean equals(Object other) {
        return (other instanceof DriverInfo)
                && this.driver == ((DriverInfo) other).driver;
    }

    public int hashCode() {
        return driver.hashCode();
    }

    public String toString() {
        return ("driver[className="  + driver + "]");
    }
}

//注册驱动的方法
public static synchronized void registerDriver(java.sql.Driver driver)    throws SQLException {

    /* Register the driver if it has not already been added to our list */    if(driver != null) {        registeredDrivers.addIfAbsent(new DriverInfo(driver));    } else {        // This is for compatibility with the original DriverManager        throw new NullPointerException();    }

    println("registerDriver: " + driver);}
//获取数据库连接
@CallerSensitivepublic static Connection getConnection(String url,    String user, String password) throws SQLException {    java.util.Properties info = new java.util.Properties();

    if (user != null) {        info.put("user", user);    }    if (password != null) {        info.put("password", password);    }

    return (getConnection(url, info, Reflection.getCallerClass()));}}

 

原文地址:https://www.cnblogs.com/1446358788-qq/p/11523294.html

时间: 2024-10-31 09:24:33

设计模式课程 设计模式精讲 15-3 桥接模式源码解析的相关文章

设计模式课程 设计模式精讲 10-2 外观模式源码解析

1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) 1.2 源码解析2 1.3 源码解析3 1.4 源码解析4 1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) jdbc在springJDBC中的封装 /** * Close the given JDBC Connection and ignore any thrown exception. * This is useful for typical finally blocks in manual JDB

设计模式课程 设计模式精讲 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方法为抽象方法,完全交给子类去实现 abstr

设计模式课程 设计模式精讲 16-5 代理模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用) 1.2 源码解析2(spring中的应用) 1.3 源码解析3(mybaties中的应用) 1 源码解析 1.1 源码解析1(jdk中的应用) java.lang.reflect.Proxy public class Proxy implements java.io.Serializable { protected Proxy(InvocationHandler h) { doNewInstanceCheck(); this.h = h; }

设计模式课程 设计模式精讲 18-3 迭代器模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用) 1.2 源码解析2(mybaties中的应用)   1 源码解析 1.1 源码解析1(jdk中的应用) java.util.Iterator(接口) public interface Iterator<E> { /** * Returns {@code true} if the iteration has more elements. * (In other words, returns {@code true} if {@link #nex

设计模式课程 设计模式精讲 19-3 策略模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用1) 1.2 源码解析2(jdk中的应用2) 1.3 源码解析3(Spring中的应用1) 1.4 源码解析4(Spring中的应用2) 1 源码解析 1.1 源码解析1(jdk中的应用1) java.util.Comparator(策略类)作为比较器的应用 package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Obj

设计模式课程 设计模式精讲 12-3 适配器模式源码解析

1 源码解析 1.1 源码解析1(在jdk中的应用) 1.2 源码解析2(Spring中的通知管理) 1.3 源码解析3(SpringMVC中的应用) 1 源码解析 1.1 源码解析1(在jdk中的应用) xmlAdapter(此类是用于适配xml的一个类,是处理xml序列化和反序列化的一个类) public abstract class XmlAdapter<ValueType,BoundType> { /** * Do-nothing constructor for the derived

设计模式-简单工厂Coding+jdk源码解析

前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来.本周周末会花时间整理出来,然后现在想的是白天更新一点并发编程,晚上回家学习设计模式.非科班出身,脑子也比较笨.博文都是自己根据学习的时候所想的思路,如果能有帮到各位的地方,那十分荣幸.如果有欠缺之处,希望能在评论中指出一起进步.好啦,开始正文了. 本套设计模式的博文,包含各种设计模式的定义.类型.适用场景及优缺点分析.并通过Coding去实际加深理论理解. 简单工厂: 该模式

Android设计模式源码解析之观察者模式

Android设计模式源码解析之观察者模式 本文为 Android 设计模式源码解析 中 观察者模式 分析 Android系统版本: 2.3 分析者:Mr.Simple,分析状态:未完成,校对者:Mr.Simple,校对状态:未开始 1. 模式介绍 模式的定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 模式的使用场景 关联行为场景.需要注意的是,关联行为是可拆分的,而不是"组合"关系: 事件多级触发场景: 跨系统的消息交换

2.15.1.linux内核源码目录结构1

2.15.1.1.源码从哪里来 (1)之前讲过,我们使用2.6.35.7版本的内核.这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本.我们讲课时使用第三种内核来讲解,后面的移植实验使用第二种内核来移植. (2)源码在开发板光盘中有.可以自己去linux下解压然后make distclean清理然后再次打包传输到windows下去解压分析:也可以直接去我网盘中下载我打包好的. (3)解压后最终在windows下得到了一个kerne