設計模式綜合例項分析之資料庫同步系統(二)

Liuwei-Sunny發表於2013-03-14

       接“設計模式綜合例項分析之資料庫同步系統(一)“。

 

        3. 享元模式和單例模式

       在資料庫同步系統中,抽象類DBObjectSynchronizer表示需要同步的資料庫物件,對於不同的資料庫物件型別,提供了不同的子類實現,在資料庫同步時可能有多個執行緒在同時進行同步工作,為了節省系統資源,可以使用享元模式來共享DBObjectSynchroizer物件,提供了享元工廠類DBObjectSynchronizerFlyweightFactory,且享元工廠類使用單例模式實現,類圖如圖5所示:

5 享元模式和單例模式例項類圖

       在圖5中,DBObjectSynchronizerFlyweightFactory充當資料庫物件同步執行者的享元工廠,同步物件執行類DBObjectSynchronizer充當抽象享元,其間接子類OracleDBlinkDBSynchronizerOracleTableDBSynchronizer等充當具體享元(由於篇幅問題,未將所有資料庫物件類一一列出)。

       在實現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()為抽象的通知方法,其子類OracleDBSynchronizeManagerexecuteSyn()方法提供了具體實現,類圖如圖6所示:

6 觀察者模式例項類圖

       在資料庫同步時,如果DBSynchronizeManagerexecuteSyn()方法被呼叫,將遍歷觀察者集合,呼叫每一個DBObjectSynchronizer物件的executeSyn()方法和compileDBObject()方法,此時DBSynchronizeManager充當抽象觀察目標,OracleDBSynchronizeManager充當具體觀察目標,DBObjectSynchronizer充當抽象觀察者,OracleTableDBSynchronizer充當具體觀察者。

 


       5. 模板方法模式

       在執行同步時,OracleDBSynchronizeManagerexecuteSyn()方法將依次呼叫synDBObject()compileDBObject()方法,並在這兩個方法中分別呼叫DBObjectSynchronizerprocessSyn()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

相關文章