恳求发送者与接管者解耦——号令模式(二)

    添加时间:2013-6-25 点击量:

    3 完全解决规划


           为了降落功能键与功能处理惩罚类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开辟人员应用号令模式来设计“自定义功能键”模块,其核心布局如图4所示:



     


     


    自定义功能键核心布局图


           在图4中,FBSettingWindow是“功能键设置”界面类,FunctionButton充当恳求调用者,Command充当抽象号令类,MinimizeCommandHelpCommand充当具体号令类,WindowHanlderHelpHandler充当恳求接管者。完全代码如下所示:


     



    [java] view plaincopyprint?



     



    1. import java.util.;  

    2.   

    3. //功能键设置窗口类  

    4. class FBSettingWindow {  

    5.     private String title; //窗口题目  

    6.     //定义一个ArrayList来存储所有功能键  

    7.     private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();  

    8.       

    9.     public FBSettingWindow(String title) {  

    10.         this.title = title;  

    11.     }  

    12.       

    13.     public void setTitle(String title) {  

    14.         this.title = title;  

    15.     }  

    16.       

    17.     public String getTitle() {  

    18.         return this.title;  

    19.     }  

    20.       

    21.     public void addFunctionButton(FunctionButton fb) {  

    22.         functionButtons.add(fb);  

    23.     }  

    24.       

    25.     public void removeFunctionButton(FunctionButton fb) {  

    26.         functionButtons.remove(fb);  

    27.     }  

    28.       

    29.     //显示窗口及功能键  

    30.     public void display() {  

    31.         System.out.println(显示窗口: + this.title);  

    32.         System.out.println(显示功能键:);  

    33.         for (Object obj : functionButtons) {  

    34.             System.out.println(((FunctionButton)obj).getName());  

    35.         }  

    36.         System.out.println(------------------------------);  

    37.     }     

    38. }  

    39.   

    40. //功能键类:恳求发送者  

    41. class FunctionButton {  

    42.     private String name; //功能键名称  

    43.     private Command command; //保持一个抽象号令对象的引用  

    44.       

    45.     public FunctionButton(String name) {  

    46.         this.name = name;  

    47.     }  

    48.       

    49.     public String getName() {  

    50.         return this.name;  

    51.     }  

    52.       

    53.     //为功能键注入号令  

    54.     public void setCommand(Command command) {  

    55.         this.command = command;  

    56.     }  

    57.       

    58.     //发送恳求的办法  

    59.     public void onClick() {  

    60.         System.out.print(点击功能键:);  

    61.         command.execute();  

    62.     }  

    63. }  

    64.   

    65. //抽象号令类  

    66. abstract class Command {  

    67.     public abstract void execute();  

    68. }  

    69.   

    70. //帮助号令类:具体号令类  

    71. class HelpCommand extends Command {  

    72.     private HelpHandler hhObj; //保持对恳求接管者的引用  

    73.       

    74.     public HelpCommand() {  

    75.         hhObj = new HelpHandler();  

    76.     }  

    77.       

    78.     //号令履行办法,将调用恳求接管者的营业办法  

    79.     public void execute() {  

    80.         hhObj.display();  

    81.     }  

    82. }  

    83.   

    84. //最小化号令类:具体号令类  

    85. class MinimizeCommand extends Command {  

    86.     private WindowHanlder whObj; //保持对恳求接管者的引用  

    87.       

    88.     public MinimizeCommand() {  

    89.         whObj = new WindowHanlder();  

    90.     }  

    91.       

    92. //号令履行办法,将调用恳求接管者的营业办法  

    93.     public void execute() {  

    94.         whObj.minimize();  

    95.     }  

    96. }  

    97.   

    98. //窗口处理惩罚类:恳求接管者  

    99. class WindowHanlder {  

    100.     public void minimize() {  

    101.         System.out.println(将窗口最小化至托盘!);  

    102.     }  

    103. }  

    104.   

    105. //帮助文档处理惩罚类:恳求接管者  

    106. class HelpHandler {  

    107.     public void display() {  

    108.         System.out.println(显示帮助文档!);  

    109.     }  

    110. }  



    为了进步体系的灵活性和可扩大性,我们将具体号令类的类名存储在设备文件中,并经由过程对象类XMLUtil来读取设备文件并反射生成对象,XMLUtil类的代码如下所示:





    [java] view plaincopy
     





    1. import javax.xml.parsers.;  

    2. import org.w3c.dom.;  

    3. import org.xml.sax.SAXException;  

    4. import java.io.;  

    5.   

    6. public class XMLUtil {  

    7. //该办法用于从XML设备文件中提取具体类类名,并返回一个实例对象,可以经由过程参数的不合返回不合类名节点所对应的实例  

    8.     public static Object getBean(int i) {  

    9.         try {  

    10.             //创建文档对象  

    11.             DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();  

    12.             DocumentBuilder builder = dFactory.newDocumentBuilder();  

    13.             Document doc;                             

    14.             doc = builder.parse(new File(config.xml));   

    15.           

    16.             //获取包含类名的文本节点  

    17.             NodeList nl = doc.getElementsByTagName(className);  

    18.             Node classNode = null;  

    19.             if (0 == i) {  

    20.                 classNode = nl.item(0).getFirstChild();  

    21.             }  

    22.             else {  

    23.                 classNode = nl.item(1).getFirstChild();  

    24.             }   

    25.   

    26.             String cName = classNode.getNodeValue();  

    27.               

    28.             //经由过程类名生成实例对象并将其返回  

    29.             Class c = Class.forName(cName);  

    30.             Object obj = c.newInstance();  

    31.             return obj;  

    32.         }     

    33.         catch(Exception e){  

    34.             e.printStackTrace();  

    35.             return null;  

    36.         }  

    37.     }  

    38. }  



           设备文件config.xml中存储了具体建造者类的类名,代码如下所示:



    编译并运行法度,输出成果如下:







    显示窗口:功能键设置


    显示功能键:


    功能键1


    功能键1


    ------------------------------


    点击功能键:显示帮助文档!


    点击功能键:将窗口最小化至托盘!


    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: