寄生型设计模式在Swing应用开发中的实践(4)

    作者:课课家教育更新于: 2016-02-03 15:37:36

    大神带你学编程,欢迎选课

      辅助类的自动映射

      我们知道在 java 的反射功能,为自动映射提供了可能性。从实际应 用中,可以判断,在界面辅助类中,需要映射的都是控件类型,都派生自 JComponent 类,我们可以遍历所有定义的 Java 成员,如果其类型为 Swing 界面控件类型,则从 GUIEngine 中提取相应的界面组件并进行成员赋值。当然为能够正确地完 成界面组件自动映射的条件是:界面组件的名称要与界面辅助类中定义的 public 成员名称保持一致。实现方法很简单,如 下面代码所示:

      清单 5. 辅助类自动映射实现关键代码清单

      private void reflectComponents(GUIEngine

      ge){

      /* 遍历类所有的属性 */

      Field[] fields = getClass().getFields();

      try {

      for (int i = 0; i < fields.length; i++) {

      Type type=fields[i].getType();

      String tmPStr=type.toString();

      if (tmpstr.indexOf("javax.swing")!=-1){

      fields[i].set(this ,ge.getComponentByName(fields[i].getName()));

      }

      }

      } catch (Exception iae) {

      iae.printStackTrace();

      }

      }

      由于这个方法对所有的辅助类都是公用的方法,所以可以抽象一个父类 UIHelp,在构造函数中,完成控件 属性的自动映射功能。在每个界面辅助类中的 getAllComponents() 方法可以取消了,代码更为的简洁。给出 UIHelp 的代 码:

      清单 6. 优化后的 UIHelp 类实现代码清单

      public class UIHelp {

      public static T getInstance(

      GUIEngine ge,Class cls){

      T help=(T)ge.getGUIHelpMap().get(cls.getName());

      try {

      if (help==null ){

      help=cls.newInstance();

      help.reflectComponents(ge,cls);

      String clsname= help.getClass().getName();

      ge.getGUIHelpMap().put(clsname, help);

      }

      }catch (InstantiationException il){

      }catch (IllegalAccessException ie){}

      return help;

      }

      private void reflectComponents(GUIEngine ge,Class cls){

      // 该代码前面已经给出,这里不重复了。

      }

      }

      上面代码分下面几步:

      在 GUIEngine 实例中,判断是否创建有该界面对应的辅助类;

      因为所有的辅 助类都是 UIHelp 的子类,所以通过泛型的方法返还的也是 UIHelp 的子类,传递的 Class 也是该子类,不用再单独进行 类型转换的判断;

      自动完成对传递进来的 辅助类的界面控件的自动映射;

      将创建的辅助类,附着在 GUIEngine;

      上述辅助类的代码就非常简单了:

      清单 7. 清单 1 描述的界面的辅助类的实现

      public class

      UPSTypeHelper extends UIHelp {

      public JButton btnOk;// 确定按钮

      public JButton btnCancel;// 取消按钮

      public JTextField txttest;// 文本框

      public JLabel labeltest ;// 文本标签

      public UPSTypeHelper getInstance(GUIEngine ge){

      return getInstance (ge,UPSTypeHelper.class );

      }

      }

      只需要在辅助类中,定义好控件类为 public 类型,调用 getInstance 就可以自动在父类中完成映射功能了。

      功能的扩展

      根据下面的示意图和上面的代码我们可以看出,一个 GUIEngine 其实不只可以附着一个辅助类 ,因为定义了一个 HashMap 来存放辅助类的实例,我们只要保证实例的名称不一样就可以了,这样我们可以用几个辅助类 来映射界面类。在配置数据的界面中,当字段非常多的时候,而且字段有明显的分类比如通过 Tab 页的形式,防止辅助类 过大,可以定义多个辅助类来完成。

       界面引擎与辅助类的映射关系示意图

    寄生型设计模式在Swing应用开发中的实践(4)_java_java辅助类_课课家

      另外一种情况是,辅助类其实也可以复用, 当界面大部分相同时,我们可以对一些经常使用到的控件,创建公用的界面助手类。每个界面助手类只映射 GUIEngine 对 象的一部分界面控件,则助手类可以被更广泛地重用

课课家教育

未登录