默认适配器设计模式
a.编写一个类,继承默认适配器
b.定义一个引用,记住被改写类的实例
c.定义构造方法,传入被改写类的实例
d.对于要改写的方法,改写即可
例: 改写com.mysql.jdbc.Connect中的close访法,
在调用时,不是关闭连接,而是返回池中
**************************************************************************
原来的类:
public class MyDataSource implements DataSource {
private static String driverClassName;
private static String url;
private static String user;
private static String password;
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static{
try {
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
props.load(in);
driverClassName = props.getProperty("driverClassName");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
Class.forName(driverClassName);
// 初始化10个连接到连接池中
for(int i=0; i<10; i++){
Connection conn = DriverManager.getConnection(url, user, password);
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 从池中获取一个连接
@Override
public synchronized Connection getConnection() throws SQLException {
if(pool.size()>0){
// Connection conn = pool.remove();
// 默认适配器模式复写close方法
MyConnection mconn = new MyConnection(conn, pool);
return mconn;
}else{
throw new RuntimeException("对不起,服务器繁忙");
}
}
@Override
此处省略一些接口中需要覆盖的方法
}
**************************************************************************
通过继承默认适配器的包装设计模式改写com.mysql.jdbc.Connect中的close访法
// 全部调用原有对象的原有方法,没有做任何功能上的改动
// 此类便是一个默认适配器 再设置一个MyConnection1继承该类,并覆盖close方法
public class ConnectionWrapper implements Connection { // 包装类
private Connection conn;
public ConnectionWrapper(Connection conn){
this.conn = conn;
}
@Override
public void clearWarnings() throws SQLException {
conn.clearWarnings();
}
此处省略一系列的覆盖的方法;
}
// 继承默认适配器类,复写close方法
public class MyConnection1 extends ConnectionWrapper {
private Connection conn;
private LinkedList<Connection> pool;
public MyConnection1(Connection conn, LinkedList<Connection> pool) {
super(conn);
this.pool = pool;
}
@Override
public void close() throws SQLException {
pool.add(conn);
}
}
在上面的获取连接,将被包装的类换为包装类:MyConnection mconn = new MyConnection(conn, pool);
**************************************************************************
a.编写一个类,继承默认适配器
b.定义一个引用,记住被改写类的实例
c.定义构造方法,传入被改写类的实例
d.对于要改写的方法,改写即可
例: 改写com.mysql.jdbc.Connect中的close访法,
在调用时,不是关闭连接,而是返回池中
**************************************************************************
原来的类:
public class MyDataSource implements DataSource {
private static String driverClassName;
private static String url;
private static String user;
private static String password;
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static{
try {
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
props.load(in);
driverClassName = props.getProperty("driverClassName");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
Class.forName(driverClassName);
// 初始化10个连接到连接池中
for(int i=0; i<10; i++){
Connection conn = DriverManager.getConnection(url, user, password);
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 从池中获取一个连接
@Override
public synchronized Connection getConnection() throws SQLException {
if(pool.size()>0){
// Connection conn = pool.remove();
// 默认适配器模式复写close方法
MyConnection mconn = new MyConnection(conn, pool);
return mconn;
}else{
throw new RuntimeException("对不起,服务器繁忙");
}
}
@Override
此处省略一些接口中需要覆盖的方法
}
**************************************************************************
通过继承默认适配器的包装设计模式改写com.mysql.jdbc.Connect中的close访法
// 全部调用原有对象的原有方法,没有做任何功能上的改动
// 此类便是一个默认适配器 再设置一个MyConnection1继承该类,并覆盖close方法
public class ConnectionWrapper implements Connection { // 包装类
private Connection conn;
public ConnectionWrapper(Connection conn){
this.conn = conn;
}
@Override
public void clearWarnings() throws SQLException {
conn.clearWarnings();
}
此处省略一系列的覆盖的方法;
}
// 继承默认适配器类,复写close方法
public class MyConnection1 extends ConnectionWrapper {
private Connection conn;
private LinkedList<Connection> pool;
public MyConnection1(Connection conn, LinkedList<Connection> pool) {
super(conn);
this.pool = pool;
}
@Override
public void close() throws SQLException {
pool.add(conn);
}
}
在上面的获取连接,将被包装的类换为包装类:MyConnection mconn = new MyConnection(conn, pool);
**************************************************************************