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

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

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

好了,同學們,大家對上回的“李四猜想”有沒有結果呀?

 

我們的口號是?。。。。。。

“沒有蛀牙”!

 

No! 是“至上”!

 

既然使用者有容易忘的可能,那就證明我們的工作做得不好。我們為什麼非要使用者做他們做不好或容易弄錯的事呢?

 

好吧,讓我們知錯就改:

 

public interface ConnectionMan extends PooledConnection.Pool{

//在這個interface裡,我們不再要求員必須封裝Connection, 他們只需要直接返回Connection。 實際上,程式設計師可以完全忘記封裝這碼事。

//我們將對返回的物件進行封裝。

  Connection getConnection()throws Exception;

  void clear();

  void closeConnection(Connection conn);

}

 

//然後,我們用一下的decorator類對返回值進行封裝

 

public class ConnectionMan2ConnectionPool implements ConnectionPool{

  public final Connection getConnection()throws SQLException{

    return PooledConnection.decorate(man.getConnection(), man);

  }

  public final void clear(){

    man.clear();

  }

  private final ConnectionMan man;

  private ConnectionMan2ConnectionPool(ConnectionMan man){

    this.man = man;

  }

  public static ConnectionPool decorate(ConnectionMan man){

    return new ConnectionMan2ConnectionPool(man);

  }

}

 

這樣,程式設計師只需要實現一個輔助interface ConnectionMan. 完全不要考慮封裝Connection的事。然後再用我們的ConnectionMan2ConnectionPool類把它轉換成ConnectionPool, 交給ConnectionPool的使用者使用。耶!

 

 

“那萬一李四忘了用ConnectionMan2ConnectionPool轉換怎麼辦?”

 

呵呵,別忘了,不是吃素的。使用者期待ConnectionPool, 而李四隻有ConnectionMan, 他想不轉換也不行啊!

 

什麼?今天的家庭作業?

啊,讓你們家長寫表揚信給ajoo老師。:)

 

 

 

 

 

 

 

玩笑。如果那位能發現進一步refactor的地方,歡迎指出!


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

相關文章