恳求发送者与接管者解耦——号令模式(二)   
               添加时间:2013-6-25 点击量: 
 
              3 完全解决规划
       为了降落功能键与功能处理惩罚类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开辟人员应用号令模式来设计“自定义功能键”模块,其核心布局如图4所示:

 
 
图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中存储了具体建造者类的类名,代码如下所示:
编译并运行法度,输出成果如下:
显示窗口:功能键设置
显示功能键:
功能键1
功能键1
------------------------------
点击功能键:显示帮助文档!
点击功能键:将窗口最小化至托盘!
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
                     
                  
     
  
 
    
    
   
   
    
  
  
     	
 
     
     
     
 
 
   
 
 
 
  
3 完全解决规划
为了降落功能键与功能处理惩罚类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开辟人员应用号令模式来设计“自定义功能键”模块,其核心布局如图4所示:

图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中存储了具体建造者类的类名,代码如下所示:
编译并运行法度,输出成果如下:
| 
 显示窗口:功能键设置 显示功能键: 功能键1 功能键1 ------------------------------ 点击功能键:显示帮助文档! 点击功能键:将窗口最小化至托盘! 无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》  | 




