1. 装设模式的概念,目的
目的在于增强被包装类的功能
思路步骤
1. 自定义类实现被包装类的所有方法
2. 在定义类中定义被包装类的成员变量
3. 通过构造方法将被包装类赋值
4. 通过所有方法均调用被包装类去实现
代码示例
被包装类
package com.ruirui.desgin1;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class DataSourceWarper implements DataSource{
//步驟: 1
public DataSource dataSource =null;
// public DataSourceWarper(Connection conn, LinkedList<Connection> list) {
// super();
// }
@Override
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//步驟: 2
调用被包装类的方法
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return dataSource.getLogWriter();
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return dataSource.getLoginTimeout();
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return dataSource.getParentLogger();
}
@Override
public void setLogWriter(PrintWriter arg0) throws SQLException {
// TODO Auto-generated method stub
dataSource.setLogWriter(arg0);
}
@Override
public void setLoginTimeout(int arg0) throws SQLException {
// TODO Auto-generated method stub
dataSource.setLoginTimeout(arg0);
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return dataSource.isWrapperFor(iface);
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// T
Auto-generated method stub
return null;
}
}
包装类
package com.ruirui.desgin1;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
public class MyDataSourceWarper extends DataSourceWarper{
public static LinkedList<Connection> list = new LinkedList<>();
public static Connection conn;
public MyDataSourceWarper() {
// super(conn, list);
}
//静态代码块 创建集合
static {
for(int i = 0 ; i < 10; i++) {
conn = Utils.getConnection();
list.add(conn);
}
}
//先进先出
@Override
public Connection getConnection() throws SQLException {
return list.removeFirst();
}
/**
* 增加了新的方法 增强了DataSource
* @param conn
*/
public void addBack(Connection conn) {
list.addLast(conn);
}
}
这么写的好处 个人认为就是干净整洁 ,以后对于被包装类的所有宽展功能都可以在这里去实现。
下面是代码的测试
package com.ruirui.desgin1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class DemoTest {
private static PreparedStatement prepareStatement;
private static ResultSet executeQuery;
private static Connection connection = null;
private MyDataSourceWarper myDataSourceWarper;
@Test
public void test() {
try {
myDataSourceWarper = new MyDataSourceWarper();
connection = myDataSourceWarper.getConnection(); //从线程池中获取对象
connection.setAutoCommit(false);
String sql = "select * from student";
prepareStatement = connection.prepareStatement(sql);
executeQuery = prepareStatement.executeQuery();
while (executeQuery.next()) {
String name = executeQuery.getString("name");
int id = executeQuery.getInt("id");
System.out.println(name + " " + id);
}
connection.commit();
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
// TODO Auto-generated ca
}finally {
myDataSourceWarper.addBack(onnection);
}
}
}
工具类
package com.ruirui.desgin1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class Utils {
private static String drivername;
private static String url;
private static String username;
private static String password;
private static Connection connection =null;
static {
drivername = ResourceBundle.getBundle("db").getString("jdbc.driverClass");
url = ResourceBundle.getBundle("db").getString("jdbc.url");
username = ResourceBundle.getBundle("db").getString("jdbc.username");
password = ResourceBundle.getBundle("db").getString("jdbc.password");
}
public static Connection getConnection() {
try {
Class.forName(drivername);
connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
public static void releaseResouce(ResultSet rs, PreparedStatement stmt, Connection conn) {
// 4.释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
// 这个对象置为null的原因是为了java虚拟机垃圾回收
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
代码连接下载地址
http://pan.baidu.com/s/1miiejWk
后续还是会有补充。。。