設計模式綜合例項分析之資料庫同步系統(二)
3. 享元模式和單例模式
在資料庫同步系統中,抽象類DBObjectSynchronizer表示需要同步的資料庫物件,對於不同的資料庫物件型別,提供了不同的子類實現,在資料庫同步時可能有多個執行緒在同時進行同步工作,為了節省系統資源,可以使用享元模式來共享DBObjectSynchroizer物件,提供了享元工廠類DBObjectSynchronizerFlyweightFactory,且享元工廠類使用單例模式實現,類圖如圖5所示:
圖5 享元模式和單例模式例項類圖
在圖5中,DBObjectSynchronizerFlyweightFactory充當資料庫物件同步執行者的享元工廠,同步物件執行類DBObjectSynchronizer充當抽象享元,其間接子類OracleDBlinkDBSynchronizer、OracleTableDBSynchronizer等充當具體享元(由於篇幅問題,未將所有資料庫物件類一一列出)。
在實現DBObjectSynchronizerFlyweightFactory時使用了單例模式(餓漢式單例),其程式碼片段如下所示:
public class DBObjectSynchronizerFlyweightFactory {
private static DBObjectSynchronizerFlyweightFactory instance = new DBObjectSynchronizerFlyweightFactory();
private Map<String, DBObjectSynchronizer> map = new HashMap<String, DBObjectSynchronizer>();
private DBObjectSynchronizerFlyweightFactory(){ }
public static DBObjectSynchronizerFlyweightFactory getInstance(){
return instance;
……
}
4. 觀察者模式
在資料庫同步系統中,使用者可以自行決定需要同步哪些物件,需要同步的DBObjectSynchronizer子類物件將註冊到DBSynchronizeManager中,DBSynchronizeManager類的程式碼片段如下所示:
public abstract class DBSynchronizeManager{
……
public void attachDBSynchronizer(DBObjectSynchronizer dbSynchronizer) {
synchronizers.add(dbSynchronizer);
}
public void detachDBSynchronizer(DBObjectSynchronizer dbSynchronizer) {
synchronizers.remove(dbSynchronizer);
}
public abstract void executeSyn() throws Exception;
}
其中attachDBSynchronizer(DBObjectSynchronizerdbSynchronizer)為註冊方法,detachDBSynchronizer(DBObjectSynchronizerdbSynchronizer)為登出方法,executeSyn()為抽象的通知方法,其子類OracleDBSynchronizeManager為executeSyn()方法提供了具體實現,類圖如圖6所示:
圖6 觀察者模式例項類圖
在資料庫同步時,如果DBSynchronizeManager的executeSyn()方法被呼叫,將遍歷觀察者集合,呼叫每一個DBObjectSynchronizer物件的executeSyn()方法和compileDBObject()方法,此時DBSynchronizeManager充當抽象觀察目標,OracleDBSynchronizeManager充當具體觀察目標,DBObjectSynchronizer充當抽象觀察者,OracleTableDBSynchronizer充當具體觀察者。
5. 模板方法模式
在執行同步時,OracleDBSynchronizeManager的executeSyn()方法將依次呼叫synDBObject()和compileDBObject()方法,並在這兩個方法中分別呼叫DBObjectSynchronizer的processSyn()和compile()方法,在OracleDBSynchronizeManager的子類中可以覆蓋synDBObject()和compileDBObject()方法,如圖7所示:
圖7 模板方法模式例項類圖
在圖7中,OracleDBSynchronizeManager充當抽象父類,其中定義了模板方法executeSyn(),NewOracleDBSynchronizeManager充當具體子類,其中OracleDBSynchronize Manager的程式碼片段如下所示:
public class OracleDBSynchronizeManager extends DBSynchronizeManager {
public void executeSyn() throws Exception {
synDBObject();
compileDBObject();
}
protected void synDBObject(){
for (DBObjectSynchronizer dbSynchronizer : synchronizers) {
try {
dbSynchronizer.processSyn(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void compileDBObject(){
for (DBObjectSynchronizer dbSynchronizer : synchronizers) {
try {
dbSynchronizer.compile(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
由於Oracle資料庫物件型別較多,而大部分物件的處理邏輯大同小異,只有少部分物件型別同步結構後需要重新編譯,因此在設計DefaultOracleObjectSynchronizer類時也可以使用模板方法模式,在其中定義一個鉤子方法getCompileable(),由子類決定是否要呼叫編譯邏輯,程式碼片段如下所示:
public class DefaultOracleObjectSynchronizer extends DBObjectSynchronizer {
......
public void compile(DBSynchronizeManager dbSynchronizeManager)
throws Exception {
if (getCompileable()){
Database destDB = dbSynchronizeManager.getDestDB();
String[] compileObjs = findAllObjects(destDB);
int iLen = compileObjs.length;
for (int i = 0; i < iLen; i++) {
compileObject(destDB, compileObjs[i]);
}
}
}
......
}
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 設計模式使用例項(5)——建造者模式例項之資料庫連線管理設計模式資料庫
- 資料庫設計例項資料庫
- Javaweb的例項--訂單管理系統--設計資料庫JavaWeb資料庫
- MapReduce程式設計例項之資料去重程式設計
- 設計模式(二)——單例模式設計模式單例
- 設計模式之單例設計模式設計模式單例
- Net設計模式例項之裝飾者模式(Decorator Pattern)設計模式
- Python設計模式之"外觀模式"例項講解Python設計模式
- 資料庫系統設計概述資料庫
- 重灌系統後,使用oradim建立資料庫例項!資料庫
- jS設計模式二:單例模式JS設計模式單例
- JS設計模式(二)--- 單例模式JS設計模式單例
- 設計模式之☞單例模式設計模式單例
- 設計模式之單例模式設計模式單例
- 設計模式之---單例模式設計模式單例
- 設計模式例項程式碼設計模式
- 資料庫名,資料庫例項名,資料庫域名,作業系統環境變數資料庫作業系統變數
- 資料庫大設計需求分析(門診掛號系統)資料庫
- 資料庫系統設計:分割槽資料庫
- 資料庫:系統設計的核心資料庫
- 設計模式之單例設計模式單例
- Oracle資料庫例項啟動步驟分析Oracle資料庫
- Java設計模式系列之單例設計模式Java設計模式單例
- PHP 設計模式之單例模式PHP設計模式單例
- Javascript 設計模式之單例模式JavaScript設計模式單例
- Javascript設計模式之單例模式JavaScript設計模式單例
- js設計模式之單例模式JS設計模式單例
- PHP 設計模式之——單例模式PHP設計模式單例
- 01 設計模式之單例模式設計模式單例
- 設計模式(一)之單例模式設計模式單例
- golang設計模式之單例模式Golang設計模式單例
- PHP設計模式之單例模式PHP設計模式單例
- Java設計模式之單例模式Java設計模式單例
- php模式設計之 單例模式PHP模式單例
- PHP設計模式之:單例模式PHP設計模式單例
- iOS 設計模式之單例模式iOS設計模式單例
- 資料庫的一種完全物件導向設計模式(包含例項) Rayphrank原創! (轉)資料庫物件設計模式
- Net設計模式例項之備忘錄模式(Memento Pattern)(2)設計模式