<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國際加速解決方案。 廣告
                # 請求發送者與接收者解耦——命令模式(二) 3 完整解決方案 為了降低功能鍵與功能處理類之間的耦合度,讓用戶可以自定義每一個功能鍵的功能,Sunny軟件公司開發人員使用命令模式來設計“自定義功能鍵”模塊,其核心結構如圖4所示: ![](http://img.my.csdn.net/uploads/201304/15/1366034181_4378.jpg) 圖4 自定義功能鍵核心結構圖 在圖4中,FBSettingWindow是“功能鍵設置”界面類,FunctionButton充當請求調用者,Command充當抽象命令類,MinimizeCommand和HelpCommand充當具體命令類,WindowHanlder和HelpHandler充當請求接收者。完整代碼如下所示: ``` import java.util.*; //功能鍵設置窗口類 class FBSettingWindow { private String title; //窗口標題 //定義一個ArrayList來存儲所有功能鍵 private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>(); public FBSettingWindow(String title) { this.title = title; } public void setTitle(String title) { this.title = title; } public String getTitle() { return this.title; } public void addFunctionButton(FunctionButton fb) { functionButtons.add(fb); } public void removeFunctionButton(FunctionButton fb) { functionButtons.remove(fb); } //顯示窗口及功能鍵 public void display() { System.out.println("顯示窗口:" + this.title); System.out.println("顯示功能鍵:"); for (Object obj : functionButtons) { System.out.println(((FunctionButton)obj).getName()); } System.out.println("------------------------------"); } } //功能鍵類:請求發送者 class FunctionButton { private String name; //功能鍵名稱 private Command command; //維持一個抽象命令對象的引用 public FunctionButton(String name) { this.name = name; } public String getName() { return this.name; } //為功能鍵注入命令 public void setCommand(Command command) { this.command = command; } //發送請求的方法 public void onClick() { System.out.print("點擊功能鍵:"); command.execute(); } } //抽象命令類 abstract class Command { public abstract void execute(); } //幫助命令類:具體命令類 class HelpCommand extends Command { private HelpHandler hhObj; //維持對請求接收者的引用 public HelpCommand() { hhObj = new HelpHandler(); } //命令執行方法,將調用請求接收者的業務方法 public void execute() { hhObj.display(); } } //最小化命令類:具體命令類 class MinimizeCommand extends Command { private WindowHanlder whObj; //維持對請求接收者的引用 public MinimizeCommand() { whObj = new WindowHanlder(); } //命令執行方法,將調用請求接收者的業務方法 public void execute() { whObj.minimize(); } } //窗口處理類:請求接收者 class WindowHanlder { public void minimize() { System.out.println("將窗口最小化至托盤!"); } } //幫助文檔處理類:請求接收者 class HelpHandler { public void display() { System.out.println("顯示幫助文檔!"); } } ``` 為了提高系統的靈活性和可擴展性,我們將具體命令類的類名存儲在配置文件中,并通過工具類XMLUtil來讀取配置文件并反射生成對象,XMLUtil類的代碼如下所示: ``` import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { //該方法用于從XML配置文件中提取具體類類名,并返回一個實例對象,可以通過參數的不同返回不同類名節點所對應的實例 public static Object getBean(int i) { try { //創建文檔對象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("config.xml")); //獲取包含類名的文本節點 NodeList nl = doc.getElementsByTagName("className"); Node classNode = null; if (0 == i) { classNode = nl.item(0).getFirstChild(); } else { classNode = nl.item(1).getFirstChild(); } String cName = classNode.getNodeValue(); //通過類名生成實例對象并將其返回 Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch(Exception e){ e.printStackTrace(); return null; } } } ``` 配置文件config.xml中存儲了具體建造者類的類名,代碼如下所示: ``` <?xml version="1.0"?> <config> <className>HelpCommand</className> <className>MinimizeCommand</className> </config> 編寫如下客戶端測試代碼: [java] view plain copy class Client { public static void main(String args[]) { FBSettingWindow fbsw = new FBSettingWindow("功能鍵設置"); FunctionButton fb1,fb2; fb1 = new FunctionButton("功能鍵1"); fb2 = new FunctionButton("功能鍵1"); Command command1,command2; //通過讀取配置文件和反射生成具體命令對象 command1 = (Command)XMLUtil.getBean(0); command2 = (Command)XMLUtil.getBean(1); //將命令對象注入功能鍵 fb1.setCommand(command1); fb2.setCommand(command2); fbsw.addFunctionButton(fb1); fbsw.addFunctionButton(fb2); fbsw.display(); //調用功能鍵的業務方法 fb1.onClick(); fb2.onClick(); } } ``` 編譯并運行程序,輸出結果如下: ``` 顯示窗口:功能鍵設置 顯示功能鍵: 功能鍵1 功能鍵1 ------------------------------ 點擊功能鍵:顯示幫助文檔! 點擊功能鍵:將窗口最小化至托盤! ``` 如果需要修改功能鍵的功能,例如某個功能鍵可以實現“自動截屏”,只需要對應增加一個新的具體命令類,在該命令類與屏幕處理者(ScreenHandler)之間創建一個關聯關系,然后將該具體命令類的對象通過配置文件注入到某個功能鍵即可,原有代碼無須修改,符合“開閉原則”。在此過程中,每一個具體命令類對應一個請求的處理者(接收者),通過向請求發送者注入不同的具體命令對象可以使得相同的發送者對應不同的接收者,從而實現“將一個請求封裝為一個對象,用不同的請求對客戶進行參數化”,客戶端只需要將具體命令對象作為參數注入請求發送者,無須直接操作請求的接收者。
                  <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>

                              哎呀哎呀视频在线观看