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

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南靖县| 天长市| 唐山市| 闻喜县| 宣武区| 南川市| 集贤县| 潍坊市| 定西市| 长岭县| 文昌市| 温泉县| 双鸭山市| 木兰县| 惠安县| 哈尔滨市| 泉州市| 屯留县| 郑州市| 全州县| 安多县| 武冈市| 登封市| 灵寿县| 平利县| 高州市| 克什克腾旗| 禹城市| 姜堰市| 白河县| 黄梅县| 余姚市| 波密县| 普兰店市| 玛曲县| 莆田市| 钟山县| 定日县| 津南区| 巴彦县| 漳浦县|