1. 目的

使界面代码承担的职责更少,便于代码的维护,提高代码可读性。

2. 动机

我们在编写客户端代码的时候,经常会用到字符资源、图片资源以及多个View 间共享实例,这些职责如果由View 自己负责,一方面,降低了代码的重用性(资源加载的代码),另一方面,也使View 承担了更多的职责,不利用View 的维护。如果这部分职责由外部实现,View 又如何访问这些资源。这就是Presentation Context 的模式所要解决的问题。

3.参与者

1. Presentation Context:它封装了View 在创建时所需要的上下文信息,并且可以作为多个View 之间共享对象的容器。

2. Component Factory:它负责创建Swing 控制和平台自定义的控制。使用Componet Factory 的好处是可以统一的控制系统内部的控件,例如:通过Component Factory 创建的对话框都可以点击Esc 键关闭,点击F1 出现Help 对话模式。

4. 特点

1. 优点:(1)使用Presentation Context 可是分解View 的职责,使View 的代码更容易维护。 (2) 使加载资源的代码可以被重用。(3)使多个View 间可以方便的共享对象。(4)使View 更容易访问客户端平台开放的接口。

5. 实现

1) ComponentFactory 接口代码

java 代码

  1. public interface ComponentFactory {
  2. public JLabel createJLabel(String labelText);
  3. public JDialog createJDialog(JComponent content);
  4. // ...
  5. }

2) ImageResourceFactory 接口代码

java 代码
  1. public interface ImageResourceFactory {
  2. public Image getImage(String imageId);
  3. public Icon getIcon(String iconId);
  4. }

3) PresentationContext 接口代码

java 代码
  1. public interface PresentationContext {
  2. public ResourceBundle getResourceBundle();
  3. public ComponentFactory getComponentFactory();
  4. public ImageResourceFactory getImageResourceFactory();
  5. public void setProperty(String name, Object value);
  6. public Object getProperty(String name);
  7. }

4) SampleView 代码

java 代码
  1. public class SampleView extends JPanel {
  2. private PresentationContext presentationContext;
  3. private ComponentFactory componentFactory;
  4. public SampleView(PresentationContext presentationContext) {
  5. this.presentationContext = presentationContext;
  6. componentFactory = presentationContext.getComponentFactory();
  7. constructUI();
  8. }
  9. protected void constructUI() {
  10. ResourceBundle resourceBundle = presentationContext.getResourceBundle();
  11. ImageResourceFactory imageResourceFactory = presentationContext
  12. .getImageResourceFactory();
  13. // Create a label with component factory that is injected by
  14. // presentation context.
  15. JLabel label = componentFactory.createJLabel(resourceBundle
  16. .getString("label.text"));
  17. label.setIcon(imageResourceFactory.getIcon("label.icon"));
  18. }
  19. public void showAsDialog() {
  20. JDialog dialog = componentFactory.createJDialog(this);
  21. dialog.pack();
  22. dialog.setVisible(true);
  23. }
  24. }

说明:

1) SampleView 中的文本资源和图片资源都是外部进行加载的,一般应用时可以由平台提供代码实现,然后各模块自己注入相应的路径。

2) SampleView 中的dialog 都是由平台提供的ComponentFactory 进行创建的,实现时平台可以在创建时,默认注册Esc 键的Listener。

6. 注意事项

1.Presentation Context 可以包含更多与特定客户端平台相关的内容,在应用时可以根据具体情况使用,但是要注意它里面不应该包含和领域逻辑相关的任何内容。

2.一个模块应该只有一个Presentation Context 实例,最好由平台创建或者有模块的Facade 负责创建。

Presentation Context相关推荐

  1. Android presentation

    2019独角兽企业重金招聘Python工程师标准>>> 对于双屏异显(lcd 和 hdmi 的双屏异显),android框架已经支持,但是底层接口功能还是要自己去实现,且需要底层驱动 ...

  2. Android | 说说Presentation

    目录 1.什么是Presentation 2.获取屏幕 2.1 使用media router来获取可以显示presentation的屏幕 2.2 通过Display Manager来获取present ...

  3. 苹果文档 UISearchController的介绍

    从这段介绍,可以知道这几个重点: 1.UISearchController 的 delegate 和 searchResultsUpdater 可以设置为其他控制器: 2.UISearchContro ...

  4. 从零开始学ios开发(十一):Tab Bars和Pickers

    不好意思各位,本人休息了一个礼拜,所以这次的进度延后了,而且这次的学习的内容比较多,时间用的也比较长,文章发布的时间间隔有些长了,望各位谅解,下面继续我们的ios之旅. 这次我们主要学习的内容有2个, ...

  5. 一种storyboard+swift实现页面跳转的方法

    一种storyboard+swift实现页面跳转的方法 如题.视图控制器A显示视频列表:视图控制器B显示视频详情,现希望将两个视图关联起来,点击A中某个视频跳转到B. 作为iOS小菜鸟我首先搜索了一下 ...

  6. 基于Android5.1的双屏异显分析

    平台:android5.1  场景:客户的设备需要使用到双屏异显.分析双屏异显时,framework所做的准备.  时间:2016.9.28 Android从4.2开始支持双屏异显,其Java使用示例 ...

  7. Java DICOM 网络传输_DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

    背景: 上一篇博文对DICOM中的网络传输进行了介绍,主要参照DCMTK Wiki中的英文原文.通过对比DCMTK与fo-dicom两个开源库对DICOM标准的具体实现,对理解DICOM标准有一个更直 ...

  8. View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views

    Resizing the View Controller's Views A view controller owns its own view and manages the view's cont ...

  9. 【转】dicom网络通讯入门(3)

    转自: dicom网络通讯入门(3) - assassinx - 博客园 接下来可以进行消息传递了 ,也就是dimse ,再来复习下 什么是dimse .n-set  n-create c-echo ...

最新文章

  1. 经常造轮子的 AI 工程师水平通常不会太差
  2. Java编程详细解析—淘宝大秒杀系统是如何设计的?
  3. Java日志框架Slf4j+Log4j入门
  4. 十九、“文捷笔妙活如水,气定神闲稳若山。”(2021.6.7)
  5. VMware vsphere 中创建虚拟机的方法
  6. XPATH获取USER列用户ID的小方法
  7. ie6下 jsonp无响应的问题
  8. 面向对象之软件需求中的体系构造
  9. 贪心 - [POI2006]ORK-Ploughing
  10. 即时通讯视频聊天原理是什么
  11. 利用ajaxSubmit()提交表单后,子窗口关闭,父窗口显示查询页面
  12. idea运行lua脚本
  13. 《追风筝的人》的寓意读后感3200字:
  14. 什么是Vagrant 以及作用
  15. iOS 唤起APP之Universal Link(通用链接)
  16. 新版Logcat使用指南
  17. V-rep 仿真与python远程控制
  18. 怎么用notepad将html格式化,Notepad++如何使用Tidy2格式化HTML文档?
  19. 数字签名技术及加密算法
  20. uva10534 hdu2198 双向LIS问题

热门文章

  1. 电脑截图快捷键ctrl加什么
  2. linux系统截图有快捷键吗,linux系统下ubuntu 中截图工具及快捷键设置
  3. html语言图片无法居中,css设置图片无法居中是什么原因?
  4. 阅读记录|《教父Ⅲ 最后的教父》
  5. 20-文件下载及读取漏洞
  6. 形容巨大用什么单词?
  7. 头孢类药物不要与酒同时服用,服用头孢要前后7天禁酒,天昏地转的太痛苦了
  8. Scanner用法总结
  9. Serverless 架构开发手册 — “人人都是 Serverless 架构师”先导篇
  10. java不重启服务动态加载properties文件