JDBC中对桥接模式的使用
java.sql.Driver
- 作为继承结构1的抽象层;
public interface Driver {
Connection connect(String url, java.util.Properties info)
throws SQLException;
// ...
com.mysql.jdbc.Driver
- 作为继承结构1的实现层;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
java.sql.DriverManager
- 作为桥的另一头,但其本身并不代表继承结构2的抽象层;
- 其组合了DriverInfo,DriverInfo是对Driver的封装,可以看成是Driver,算是把Driver的整个继承结构给桥接过来了;
- 但是DriverManager本身并不是继承结构2的抽象,那谁是呢? Connection;java.sql.Connection是作为继承结构2的抽象的;
- DriverManager通过registerDriver(...)将具体的Driver注册进来,然后具体的Driver创建出具体的Connection;
- DriverManager通过组合的方式将自己变成桥梁,桥接了Driver和Connection两个继承结构;
public class DriverManager {
// List of registered JDBC drivers
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
// ...
}
特别注解:我觉得其实这不能算严格意义上的桥接模式,桥的一边其实是工厂方法模式(Driver-Connection, FabricMySQLDriver-FabricMySQLConnectionProxy),DriverManager桥接了一个工厂方法,但桥的这边并没有继承结构,和那边的继承结构够有排列组合的那么一个意思