從一個ConnectionPool的實現看design pattern的運用 (二) (轉)
從一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從一個ConnectionPool的實現看design pattern的運用 (一) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (六) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (七) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (四) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (三) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (五) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (續六) (轉)
- 從一個ConnectionPool的實現看design pattern的運用 (source code for Java 1.1) (轉)Java
- aspectJ 實現design pattern
- 從編譯原理看一個直譯器的實現編譯原理
- Observer Design Pattern in C#! (轉)ServerC#
- 從0實現一個tiny react(二)React
- STL and Design Pattern
- 從零開始做一個SLG遊戲(二):用mesh實現簡單的地形遊戲
- 從二叉樹和iterator看程式碼結構設計 (關於adapter的運用) (轉)二叉樹APT
- 從一個群友問題看流複製實現原理
- 用Python實現一個實時運動的大掛鐘效果Python
- Design Pattern理解碎片
- 從零開始實現一個簡易的Java MVC框架(二)--實現Bean容器JavaMVC框架Bean
- 從流程看企業營運(轉)
- 一個用C#實現的簡單http server (轉)C#HTTPServer
- 用java實現一個簡單的房屋管理程式。 (轉)Java
- 從另一個考慮來看程式碼的風格 (轉)
- 從一個安裝檔案看CGI的安全性 (轉)
- 從零開始實現一個RPC框架(二)RPC框架
- 解構Core J2EE Pattern ――GoF Design Pattern的自然延伸Go
- Design pattern 第一講 基礎知識
- 不太理解the design pattern java companion一書中的CommandJava
- 從一個例子看Go的逃逸分析Go
- [review]Design Pattern:CommandView
- 用java實現一個簡單的序列化的例子(轉)Java
- 用java實現一個簡單的序列化的例子 (轉)Java
- 從0搭建一個實用的MVVM框架MVVM框架
- 用一個棧實現另一個棧的排序排序
- 基於RabbitMQ.Client元件實現RabbitMQ可複用的 ConnectionPool(連線池)MQclient元件
- 從Preact瞭解一個類React的框架是怎麼實現的(二): 元素diffReact框架
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- Node.js design pattern : moduleNode.js