<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 請求發送者與接收者解耦——命令模式(五) 6 請求日志 請求日志就是將請求的歷史記錄保存下來,通常以日志文件(Log File)的形式永久存儲在計算機中。很多系統都提供了日志文件,例如Windows日志文件、Oracle日志文件等,日志文件可以記錄用戶對系統的一些操作(例如對數據的更改)。請求日志文件可以實現很多功能,常用功能如下: (1) “天有不測風云”,一旦系統發生故障,日志文件可以為系統提供一種恢復機制,在請求日志文件中可以記錄用戶對系統的每一步操作,從而讓系統能夠順利恢復到某一個特定的狀態; (2) 請求日志也可以用于實現批處理,在一個請求日志文件中可以存儲一系列命令對象,例如一個命令隊列; (3) 可以將命令隊列中的所有命令對象都存儲在一個日志文件中,每執行一個命令則從日志文件中刪除一個對應的命令對象,防止因為斷電或者系統重啟等原因造成請求丟失,而且可以避免重新發送全部請求時造成某些命令的重復執行,只需讀取請求日志文件,再繼續執行文件中剩余的命令即可。 在實現請求日志時,我們可以將命令對象通過序列化寫到日志文件中,此時命令類必須實現Java.io.Serializable接口。下面我們通過一個簡單實例來說明日志文件的用途以及如何實現請求日志: Sunny軟件公司開發了一個網站配置文件管理工具,可以通過一個可視化界面對網站配置文件進行增刪改等操作,該工具使用命令模式進行設計,結構如圖6所示: ![](http://img.my.csdn.net/uploads/201304/15/1366040729_7038.jpg) 圖6 網站配置文件管理工具結構圖 現在Sunny軟件公司開發人員希望將對配置文件的操作請求記錄在日志文件中,如果網站重新部署,只需要執行保存在日志文件中的命令對象即可修改配置文件。 本實例完整代碼如下所示: ``` import java.io.*; import java.util.*; //抽象命令類,由于需要將命令對象寫入文件,因此它實現了Serializable接口 abstract class Command implements Serializable { protected String name; //命令名稱 protected String args; //命令參數 protected ConfigOperator configOperator; //維持對接收者對象的引用 public Command(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public void setConfigOperator(ConfigOperator configOperator) { this.configOperator = configOperator; } //聲明兩個抽象的執行方法execute() public abstract void execute(String args); public abstract void execute(); } //增加命令類:具體命令 class InsertCommand extends Command { public InsertCommand(String name) { super(name); } public void execute(String args) { this.args = args; configOperator.insert(args); } public void execute() { configOperator.insert(this.args); } } //修改命令類:具體命令 class ModifyCommand extends Command { public ModifyCommand(String name) { super(name); } public void execute(String args) { this.args = args; configOperator.modify(args); } public void execute() { configOperator.modify(this.args); } } //省略了刪除命令類DeleteCommand //配置文件操作類:請求接收者。由于ConfigOperator類的對象是Command的成員對象,它也將隨Command對象一起寫入文件,因此ConfigOperator也需要實現Serializable接口 class ConfigOperator implements Serializable { public void insert(String args) { System.out.println("增加新節點:" + args); } public void modify(String args) { System.out.println("修改節點:" + args); } public void delete(String args) { System.out.println("刪除節點:" + args); } } //配置文件設置窗口類:請求發送者 class ConfigSettingWindow { //定義一個集合來存儲每一次操作時的命令對象 private ArrayList<Command> commands = new ArrayList<Command>(); private Command command; //注入具體命令對象 public void setCommand(Command command) { this.command = command; } //執行配置文件修改命令,同時將命令對象添加到命令集合中 public void call(String args) { command.execute(args); commands.add(command); } //記錄請求日志,生成日志文件,將命令集合寫入日志文件 public void save() { FileUtil.writeCommands(commands); } //從日志文件中提取命令集合,并循環調用每一個命令對象的execute()方法來實現配置文件的重新設置 public void recover() { ArrayList list; list = FileUtil.readCommands(); for (Object obj : list) { ((Command)obj).execute(); } } } //工具類:文件操作類 class FileUtil { //將命令集合寫入日志文件 public static void writeCommands(ArrayList commands) { try { FileOutputStream file = new FileOutputStream("config.log"); //創建對象輸出流用于將對象寫入到文件中 ObjectOutputStream objout = new ObjectOutputStream(new BufferedOutputStream(file)); //將對象寫入文件 objout.writeObject(commands); objout.close(); } catch(Exception e) { System.out.println("命令保存失敗!"); e.printStackTrace(); } } //從日志文件中提取命令集合 public static ArrayList readCommands() { try { FileInputStream file = new FileInputStream("config.log"); //創建對象輸入流用于從文件中讀取對象 ObjectInputStream objin = new ObjectInputStream(new BufferedInputStream(file)); //將文件中的對象讀出并轉換為ArrayList類型 ArrayList commands = (ArrayList)objin.readObject(); objin.close(); return commands; } catch(Exception e) { System.out.println("命令讀取失敗!"); e.printStackTrace(); return null; } } } ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { ConfigSettingWindow csw = new ConfigSettingWindow(); //定義請求發送者 Command command; //定義命令對象 ConfigOperator co = new ConfigOperator(); //定義請求接收者 //四次對配置文件的更改 command = new InsertCommand("增加"); command.setConfigOperator(co); csw.setCommand(command); csw.call("網站首頁"); command = new InsertCommand("增加"); command.setConfigOperator(co); csw.setCommand(command); csw.call("端口號"); command = new ModifyCommand("修改"); command.setConfigOperator(co); csw.setCommand(command); csw.call("網站首頁"); command = new ModifyCommand("修改"); command.setConfigOperator(co); csw.setCommand(command); csw.call("端口號"); System.out.println("----------------------------"); System.out.println("保存配置"); csw.save(); System.out.println("----------------------------"); System.out.println("恢復配置"); System.out.println("----------------------------"); csw.recover(); } } ``` 編譯并運行程序,輸出結果如下: ``` 增加新節點:網站首頁 增加新節點:端口號 修改節點:網站首頁 修改節點:端口號 ---------------------------- 保存配置 ---------------------------- 恢復配置 ---------------------------- 增加新節點:網站首頁 增加新節點:端口號 修改節點:網站首頁 修改節點:端口號 ```
                  <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>

                              哎呀哎呀视频在线观看