定义
GoF 《设计模式》的解释:
Decouple an abstraction from its implementation so that the two can vary independently 将抽象和实现解耦,让它们可以独立变化。
结构
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
应用
JDBC
不同的数据库驱动,共用同一套JDBC规范,即同一套接口,如Connection,Statement,ResultSet等。
Class.forName("com.mysql.jdbc.Driver");Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName首先会要求JVM查找并加载指定Driver类,并执行该类的静态代码。相关的静态代码如下,目的就是将 MySQL/Oracle Driver 注册到 DriverManager 类中。
package com.mysql.jdbc;import java.sql.SQLException;public class Driver extends NonRegisteringDriver implements java.sql.Driver {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()}}
注册到 DriverManager 之后,后续所有对 JDBC 接口的调用,都会委派到对具体的 Driver 实现类来执行。而 Driver 实现类都实现了相同的接口(java.sql.Driver )。
public class DriverManager {private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();//...static {loadInitialDrivers();println("JDBC DriverManager initialized");}//...public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException {if (driver != null) {registeredDrivers.addIfAbsent(new DriverInfo(driver));} else {throw new NullPointerException();}}public 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()));}//...}
对于这个例子,抽象指的是JDBC规范,是一系列JDBC接口。实现指的是MYSQL和ORACLE针对这些接口的实现。而抽象是由JDK开发团队负责开发,实现则由各自的数据库开发团队进行开发。
