posts - 66,  comments - 11,  trackbacks - 0
              Decorator模式:簡單來講,就是通過一個Decorator對原有對象進行封裝,同事實現與原有對象相同的接口,從而得到一個基于原有對象的,對既有接口的增強型實現。
              首先引入一個ConnectionDecorator類:
             
          public class ConnectionDecorator implements Connection{
                Connection dbconn;
                
          public ConnectionDecorator(Connnection conn){
                  
          this.dbconn = conn;//實際從數據庫獲得的Connection引用
                }
                
          public void close()throws SQLException{
                  
          this.dbconn.close();
                }
                
          public void commit()throws SQLException{
                  
          this.dbconn.commit();//調用實際連接的commit方法
                }
                
              }
              ConnectionDecorator類實際上是對傳入的數據庫連接加上了一個外殼,它實現了java.sql.Connection接口,不過本身并沒有實現任何實際內容,只是簡單的把方法的實現委托給運行期實際獲得的Connection實例,而從外部看,ConnectionDecorator與普通的Connection實例沒有什么區別。
             
          public class PooledConnection extends ConnectionDecorator implements Connection{
                
          private ConnectionPool connPool;
                
          public PooledConnection(ConnectionPool pool,Connection conn){
                  
          super(conn);
                  connPool 
          = pool;
                }
                
          //覆蓋close方法,將數據庫連接返回連接池中,而不是直接關閉連接
                public void close()throws SQLException{
                  connPool.releaseConnection(
          this.dbconn);
                }
          }

          動態代理:
            
          public class ConnectionHandler implements InvocationHandler{
                Connection dbconn;
                ConnectionPool pool;

                
          public ConnectionHandler(ConnectionPool connPool){
                  
          this.pool = connPool;
                }
                
          //將動態代理綁定到指定Connection
                public Connection bind(Connection conn){
                  
          this.dbconn = conn;
                  Connection proxyConn 
          = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);
                  
          return proxyConn;
                }
                
          //方法調用攔截器
                public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
                  Object obj 
          =null;
                  
          if("close".equals(method.getName())){
                    pool.releaseConnection(dbconn);
                  }
          else{
                    obj 
          = method.invoke(dbconn,args);
                  }
                  
          return obj;
                }
              }
              ConnectionHandler connHandler 
          = new ConnectionHandler(this);
              
          return connHandler.bind(conn);
          可以看到,基于Dynamic Proxy模式的實現相對Decorator更加簡潔明了。

          posted on 2009-10-08 10:02 王永慶 閱讀(209) 評論(0)  編輯  收藏 所屬分類: HIBERNATE
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 恭城| 年辖:市辖区| 冀州市| 大理市| 洪雅县| 石狮市| 武定县| 西乌珠穆沁旗| 苏尼特右旗| 峨边| 东源县| 皋兰县| 东乌珠穆沁旗| 电白县| 仁怀市| 酒泉市| 山东| 临城县| 仙居县| 喀喇沁旗| 江阴市| 承德市| 汾西县| 互助| 桑日县| 灌阳县| 永川市| 桂阳县| 土默特右旗| 卢龙县| 桑日县| 龙海市| 泾源县| 宁陵县| 阜康市| 阜新市| 章丘市| 罗甸县| 和静县| 新河县| 大安市|