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

          動態(tài)代理:
            
          public class ConnectionHandler implements InvocationHandler{
                Connection dbconn;
                ConnectionPool pool;

                
          public ConnectionHandler(ConnectionPool connPool){
                  
          this.pool = connPool;
                }
                
          //將動態(tài)代理綁定到指定Connection
                public Connection bind(Connection conn){
                  
          this.dbconn = conn;
                  Connection proxyConn 
          = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);
                  
          return proxyConn;
                }
                
          //方法調(diào)用攔截器
                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模式的實現(xiàn)相對Decorator更加簡潔明了。

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

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 榆林市| 凤台县| 福贡县| 汶川县| 青岛市| 丽江市| 青河县| 榆社县| 建湖县| 司法| 房产| 仲巴县| 封丘县| 馆陶县| 兴业县| 巴彦淖尔市| 进贤县| 天峻县| 东安县| 保德县| 那坡县| 彰化县| 阳朔县| 新宾| 泉州市| 石泉县| 襄汾县| 桂阳县| 甘德县| 晋江市| 云梦县| 钦州市| 博白县| 沅陵县| 林周县| 鄄城县| 衡南县| 宝清县| 新河县| 太白县| 封开县|