快速业务通道

了解Eclipse中的JFace数据绑定,第3部分: 使用高级功能 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

清单 1. 受损的启用代码

private void createControls(Composite c) {    ...    YearsMarriedEnablementListener listener = new YearsMarriedEnablementListener();    this.nameTxt.addModifyListener(listener);    this.spouseTxt.addModifyListener(listener); } private class YearsMarriedEnablementListener implements ModifyListener {    public void modifyText(ModifyEvent e) {      boolean enable = false;      if ((nameTxt.getText().trim().length() > 0)          && (spouseTxt.getText().trim().length() > 0)) {        enable = true;      } else {        yearsMarriedTxt.setText("");      }      yearsMarriedTxt.setEnabled(enable);    } }

这个示例中存在很多问题。首先,请注意 YearsMarriedEnablementListener 更像是一个补救措施,而不是应用程序的战略组成部分。第二个问题是此侦听程序中的代码直接引用了 UI 控件。为了测试这段代码,将必须把整个表实例化,包括 UI 控件。使用 Presentation Model 的 UI 设计模式可以更好地构建这段代码。

引入 Presentation Model

桌面应用程序开发的一种核心模式是 Model-View-Controller (MVC) 模式。此模式不是十分适合现代 UI 开发。每个小部件都是自身的小型 MVC 三元组,在小部件级别留给应用程序可做的操作很少。但是,在应用程序级别,就要特别关注需要处理的启用、验证和数据同步等方面。

尝试解决这些问题的一种模式是 Model-View-Presenter 模式。使用该模式,UI 控件将委托控制器对象来完成一些业务任务,例如单击按钮时 “保存”。将业务逻辑移至控制器是迈向可测试性的正确一步。但是,这种模式没有注意到一个重要因素:控制器逻辑经常需要访问 UI 中的数据和更改状态。如果此状态保存在小部件中,例如文本小部件的启用属性,那么测试控制器就需要完整的 UI 或桩来假冒其状态。

将状态和业务逻辑从 UI 中提取出来就可以修正这种情况,这种方法是由另一个名为 Presentation Model 的 MVC 模式提出来的。可以在 Presentation Model 中测试业务逻辑和状态更改而无需使用 UI 代码。这种分离还使 UI 与 Presentation Model 之间的交互仅限于同步数据和状态。

图 2 显示了 Presentation Model 模式的示意图。了解了一些关于 Presentation Model 的背景知识之后,现在就可以使用这种结构更优的模式来转换受损的示例。

图 2. Presentation Model 模式

了解Eclipse中的JFace数据绑定,第3部分: 使用高级功能(3)

时间:2011-02-11 IBM Scott Delap

编写可测试的 Presentation Model:测试

要将先前的示例重构为使用 Presentation Model 的示例,第一步是编写测试。为此,需要将 JUnit 支持添加到项目中。在软件包浏览器中单击 META-INF/MANIFEST.MF 文件,以打开 Eclipse MANIFEST.MF 编辑器。然后,单击 Dependencies 选项卡并单击 Required Plug-ins 部分中的 Add 按钮。选择 org.junit 插件,然后单击 OK。现在将显示类似图 3 所示的编辑器。

图 3. 添加 JUnit 支持后的 Manifest.MF 编辑器

接下来,创建一个新软件包和一个名为 ContactPresentationModelTest 的新类,该类用于扩展 TestCase。插入清单 2 中所示的测试方法。

清单 2. 用于 Presentation Model 的测试

public void testYearsMarriedEnablement() {    Contact contact = new Contact();    ContactPresentationModel presentationModel = new    ContactPresentationModel(        contact);    a

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号