從一個ConnectionPool的實現看design pattern的運用 (二) (轉)

worldblog發表於2007-12-13
從一個ConnectionPool的實現看design pattern的運用 (二) (轉)[@more@] 

從一個ConnectionPool的實現看design pattern的運用 ():namespace prefix = o ns = "urn:schemas--com::office" />

好啦,現在讓我們看看我們是怎樣設計這個ConnectionPool的介面的。

Public interface ConnectionPool{

  Connection getConnection();

  Void clear();

}

當然,這只是一個簡化的介面。真正實現時也許我們還會有一些其他的方法。如同時支援同步getConnection()和非同步getConnection().

同時,這個返回的Connection必須改寫close()方法。原來的close()方法是關閉物理連線,但現在,我們要把這個Connection返還到ConnectionPool. 因此,這個Connection必須知道它出身的ConnectionPool.

這樣,仍然Connection.close(), 也不用擔心把Connection返還到錯誤的ConnectionPool.

 

再來看看我們的實現:

public class ConnectionPoolImpl: implements ConnectionPool{

  class PooledConnection implements Connection{

    private final Connection conn;

    private Boolean closed;

    public PooledConnection(Connection conn)

throws Exception{

    this.conn = conn;

    closed = conn.isClosed();

  }

    public void close(){

    if(!closed){

//保證重複呼叫close()不會把一個connection重複返還。

      closeConnection(conn);

      closed = true;

    }

  }

    public Boolean isClosed(){return closed;}

    public Statement createStatement()

  throws SQLConnection{

    if(isClosed()) throw new SQLException(“Connection closed”);

    return conn.createStatement();

  }

    public void commit()

  throws SQLConnection{

    if(isClosed()) throw new SQLException(“Connection closed”);

    conn.commit();

  }

    //其他所有的方法都這樣做委託。

  }

public synchronized Connection getConnection(){

    如果pool裡有Connection

從pool中去掉一個Connection conn;

clients++;

return new PooledConnection(conn);

    否則,如果clients

    生成一個新的連線conn

    clients++;

    return new PooledConnection(conn);

    否則,wait(),直到pool中有空閒Connection   

  }

  //其他的實現都和我們第一章裡的程式碼一樣。

}

 

好了,這樣,透過內部類PooledConnection這樣一個wrapper, 我們就可以實現這個能處理ConnectionPool的Connection.

對了,忘了說了,這個PooledConnection其實就是design pattern裡的decorator。

 

現在讓我們再欣賞一下我們的程式碼吧。ConnectonPoolImpl提供了一種基於簡單策略的ConnectionPool的實現。PooledConnection封裝了連線,使之能和ConnectionPool協同工作。

完美吧?

 

 

 

不過,慢著!PooledConnection只是和ConnectionPoolImpl協同工作。張三要寫ConnectionPool2還得自己重新實現一個decorator.

怎麼樣能使不同的ConnectionPool的實現重用我們PooledConnection呢?

 

而且,在所有大約二十個委託裡,我們都有if(isClosed())……, 是不是很眼熟啊?一個Connection一旦被close()之後,只有在涅磐之後(透過ConnectionPool.getConnection()再次返回),才能使用。而所有對關閉了的Connection的呼叫,返回結果都是一樣的.(不行,不行,不行!)

猜到點什麼了嗎?對啦,state pattern!

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992453/,如需轉載,請註明出處,否則將追究法律責任。

相關文章