包装设计模式——
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()); }
相关文章推荐
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
- 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本
- svn版本库目录结构
- nginx使用ssl模块配置HTTPS支持
- dp和px相互转换
- 强制重启N种方法
- 动态显示和隐藏状态栏
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
- JavaScript的编码规范
- 老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览
- 谈谈Memcached与Redis
- Python模块学习:glob 文件路径查找
- hdu 1158(DP)
- linux下vim命令模式下的常用操作
- 一个不错的像童话的梦
- 自定义异常
- git学习和使用(二) 远程版本库的操作和一些git的概念
- 聚类
- 谈谈自己的自学情况--Java
- 02: 均值(1.5编程基础之循环控制)