您的位置:首页 > 其它

包装设计模式——

2015-12-24 17:20 344 查看
首先建立数据连接成(自己建立的)
/**
* 存在必要性?
*         数据库连接作为非常重要的资源 ,用完了要不要立即销毁?----(不能立即关闭)
* 不能立即关闭?谁维护
*             ---------------专门交给一个人来管理(池-----------池子中放了好多数据库连接)
*
* 非常 有必要存在!!!
*                 池子在java类中如何表现?--------------------集合--------(Connection)----用什么集合?
*
* List  集合来模拟池
*             1.初始化一些连接
*
* @author wangli
*
*/
public class MyDataSource1 {
private static  List<Connection> pool = new ArrayList<Connection>();//池子
private static int size=10;
public static void setSize(int size) {
MyDataSource1.size = size;
}

//初始化池中的连接
static{
try {
for (int i = 0; i < size; i++) {
pool.add(JdbcUtil.getConnection());
}
} catch (Exception e) {
e.printStackTrace();
}

}

//统一提供方法,用于从池中获取连接
public static synchronized Connection getConnection(){
if(pool.size()>0){
Connection con =  pool.remove(0);//删除这个连接,因为别人此时不能再用它

//真正开始包装 别人
MyConnection2 con2 = new MyConnection2(con,pool);
return con2;
}else{
throw new RuntimeException("池中无连接");
}

}

//还回一个连接到池中
public static void close(Connection con){
pool.add(con);//将这个连接回收到池中
}

//取池
public static List<Connection> getPool() {
return pool;
}

}

一、外包装和被包装实现一样的接口
public class ConnectionAdapter implements Connection {
}
二、
//包装模式                                     //似你
public class MyConnection2  extends ConnectionAdapter {
private Connection con;//还有你
private List<Connection> pool;
//拜托你
public MyConnection2(Connection con,List<Connection> pool){
this.con  = con;
this.pool = pool;
}

@Override  //改写它
public void close() throws SQLException {
pool.add(con);
}

}
三、test测试一下
/**
* @param args
*/
public static void main(String[] args) {
MyDataSource1 myds = new MyDataSource1();
System.out.println("初始化好了,池中连接数:"+myds.getPool().size());

Connection con = myds.getConnection();//从池中取一个连接
System.out.println("取出但未还,池中连接数:"+myds.getPool().size());

System.out.println("当前连接对象:"+con);
try {
con.close();//面向接口编程,con其实是MyConnection2   对象。调用的是MyConnection2 .close()既被包装后改写的close()方法。
} catch (SQLException e) {
e.printStackTrace();
}

System.out.println("用完后还了,池中连接数:"+myds.getPool().size());
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: