<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 設計模式綜合實例分析之數據庫同步系統(三) 接“設計模式綜合實例分析之數據庫同步系統(二)“。 6. 策略模式 由于表數據的同步方式有三種,分別是增量同步、先Delete后Insert方式、臨時表方式,因此可以定義一個同步策略接口DataSynStrategy,并提供三個具體實現類:IncSynStrategy、DelAndInsSynStrategy和TempTableSynStrategy。類圖如圖8所示: ![](http://img.my.csdn.net/uploads/201303/14/1363226626_9216.jpg) 圖8 策略模式實例類圖 在圖8中,Oracle表同步對象類OracleTableDBSynchronizer充當環境類,DataSynStrategy充當抽象策略類,其子類IncSynStrategy、DelAndInsSynStrategy和TempTableSynStrategy充當具體策略類。 在OracleTableDBSynchronizer中將DataSynStrategy作為方法synSingleTable()的局部變量,因此OracleTableDBSynchronizer與DataSynStrategy為依賴關系,如果為全局變量,則為關聯關系。 7. 組合模式、命令模式和職責鏈模式 在使用臨時表方式實現表同步時可以定義一系列命令對象,這些命令封裝對數據庫的操作,由于有些操作修改了數據庫結構,因此傳統的JDBC事務控制起不到作用,需要自己實現操作失敗后的回滾邏輯。此時可以使用命令模式進行設計,在設計時還可以提供宏命令MacroCommand,用于將一些具體執行數據庫操作的命令組合起來,形成復合命令。類圖如圖9所示(由于原始類圖比較復雜,考慮到可讀性,圖9進行了適當簡化,不過簡化了之后還是挺復雜的): ![](http://img.my.csdn.net/uploads/201303/14/1363226681_1056.jpg) 圖9 組合模式、命令模式和職責鏈模式實例類圖 (由于涉及到多個模式的聯用,此圖有點點復雜) 在圖9中,TempTableSynCommand充當抽象命令,MacroCommand充當宏命令類,RenameTableCommand、SynTableDataCommand和RenameTableConstraintCommand充當具體命令,TempTableSynStrategy充當請求調用者,DataSynHelper充當請求接收者,在DataSynHelper中定義了輔助實現臨時表方式同步的一些方法,在命令類中將調用這些方法。在TempTableSynCommand中聲明了公共的execute()方法,并提供了回滾方法undo(),其子類實現具體的執行操作與恢復操作。DataSynHelper接口聲明了進行數據庫操作的方法,在其子類DataSynHelperImpl中實現了這些方法。 在TempTableSynCommand中還定義了兩個子類型的變量previousCommand、nextCommnad用于保存前一個命令和后一個命令,其中nextCommnad用于在執行完當前命令的業務邏輯后,再執行下一個命令的業務邏輯;而previousCommand用于在出現異常時,調用上一個命令的undo()方法實現恢復操作。此時使用了職責鏈模式,nextCommnad.execute()實現正向職責鏈,而previousCommand.undo()加上Java的異常處理機制實現反向職責鏈。 MacroCommand是宏命令,其代碼片段如下所示: ``` public class MacroCommand extends TempTableSynCommand { TempTableSynCommand lastCommand = this; public void add(TempTableSynCommand tempTableSynCommand) { tempTableSynCommand.setPreviousCommand(lastCommand); lastCommand = tempTableSynCommand; //創建命令鏈 } protected void execute() throws Exception { …… } protected void undo() throws Exception { …… } } ``` 在請求調用者類TempTableSynStrategy中通過如下代碼片段來調用宏命令對象的execute()方法: ``` public class TempTableSynStrategy extends DataSynStrategy { public String processSyn() { //其他代碼省略 String tempTableName = generateTempTableName(); String backupTableName = "BAK_" + tempTableName; DataSynHelper dataSynHelper = new DataSynHelperImpl(); MacroCommand marcoCommand = new MacroCommand(); marcoCommand.add(new RenameTableConstraintCommand(dataSynHelper, tableName, destDB)); marcoCommand.add(new SynTableDataCommand(dataSynHelper, tableName, tempTableName, srcDB, destDB)); marcoCommand.add(new RenameTableCommand(dataSynHelper, tableName, backupTableName, destDB)); marcoCommand.add(new RenameTableCommand(dataSynHelper, tempTableName, tableName, destDB)); try{ marcoCommand.execute(); try { //其他代碼省略 } catch (Exception e) { e.printStackTrace(); } } catch (Exception e){ e.printStackTrace(); } //其他代碼省略 } } ``` 【本實例分析到此全部結束,希望能給各位帶來幫助!】
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看