界面组装器模式

简介:

本文提出了一种界面设计中的架构模式-界面组装器模式,它致力于分解界面 ,将界面和组装行为解耦,将界面逻辑处理与领域逻辑处理解耦,这样我们在开 发 GUI 胖客户端界面应用时可以从众多的界面控制管理中解脱出来,而专注于我 们的后台业务逻辑的开发。通过该模式,我们可以动态地组装我们的界面,我们 甚至还可以在我们的界面中轻松地插入 transaction 事务或 session 会话管理 。

本文将通过分析设计一个架构的过程来讲解该模式,从一个简单的设计模型开 始,一步步走向一个完整的架构。借此也向大家展示一个架构设计的思维历程。 另外,本文给出了 Eclipse SWT(Standard Widget Toolkit) 的示例。

问题引出

界面设计常常是模式产生的根源,无论是架构模式,还是设计模式,比如 MVC 模式,Observer,Facade 等,也是整个软件行业向前发展的动力。遗憾的是,即 使在软件技术发达的今天,界面设计仍是软件设计中的难以突破的瓶颈之一。我 们用过 Java swing 或 Eclipse SWT 作过项目的都知道,要将界面进行分解是很 困难的,它不像我们的业务逻辑,可以方便地按职责分解到不同的类中去实现, 因为各个业务逻辑之间耦合度很低。但界面逻辑不一样,你不可能将一个文本框 的读取操作委任到另一个类中去,而且各个界面元素之间相互依赖,无法去除耦 合,一般的做法只能是在界面元素的事件触发(比如按钮点击事件)时,将输入数 据封装成一个数据对象传给后台的逻辑处理类来处理。

Eclipse 的 Wizard 框架在界面分解上提供了一种很好的实践,它可以将按钮 区和其他界面区分离出来,用类似 MVC 的方式实现了 Wizard 框架。但这个实现 并非没有瑕疵,一个缺点是 wizard 是一个 plug-in,这样的话就减少了可重用 性,不能移植到 eclipse 以外的环境。另一个缺点就是它引入了很大的复杂性, 而且在一些对界面元素的控制上丧失了一些精细控制的能力,这可能是它过度地 强调了自动化和用户扩展的方便性的缘故。比如,用户不能将自己的逻辑插入按 钮区的按钮事件控制中,而只能在自定义区的界面元素 Listener 中设定按钮区 状态,如果用户自定义的界面元素很多,就需要很多个 Listener 来组合判断一 个按钮状态(如是否进行“下一步”),这样的话就很影响性能,而且无端地多 了一堆复杂的逻辑判断,也就是说本来只需在按钮 Listener 事件中处理的逻辑 现在要分散在各个界面元素的 Listener 中去处理。这也正是设计上一个值得反 复强调的普遍问题:当你要保持架构或设计的完美性时必然会以丧失其他特性为 代价。世上永远没有完美的东西,我们只关注适合我们的。

我下面要提出的这个架构模式的灵感来自于我的一个真实项目,一个用 RSA( Rational Software Architect)/Eclipse 建模的项目,在 RSA 环境中,读写模 型都必须在一个特有的 context 下才能操作,这就意味着我在界面的启动之前必 须封装好输入数据,关闭之后返回输出数据,而不是直接处理数据,必须对输入/ 输出数据对象进行封装。正如前面提到的,这种情况界面设计中很普遍。所以, 在模式命名时我用了组装器-assembler 这个词,有一层意思是输入/输出数据对 象的组装,另一层意思就是界面部件(界面元素的集合)的组装,这里的组装还 有更深层次的涵义就是指界面部件的可装配性,可以在运行时动态组装。而且这 个模式可以用任何语言(Java,C++ 等)来实现。在这里我会从一个简单的设计 模型开始,一步步走向一个完整的架构。借此也向大家展示一个架构设计的思维 历程。本文中给出了 Eclipse SWT(Standard Widget Toolkit) 的示例。

时间: 2024-08-03 09:16:38

界面组装器模式的相关文章

QQ2009最抢眼的功能 界面管理器

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   QQ2009以前是模拟ICQ来的,ICQ是面向国际的一个聊天工具,是I seek you(我找你)的意思,OICQ模仿它在ICQ前加了一个字母O,意为opening I seek you,意思是"开放的ICQ",但是遭到了控诉说它侵权,于是腾讯的老板就把OICQ改了名字叫QQ,就是现在我们用的QQ,除了名字,腾讯QQ的标志却一直没有改动,一直

深入解析设计模式中的装饰器模式在iOS应用开发中的实现_IOS

装饰器模式可以在不修改代码的情况下灵活的为一对象添加行为和职责.当你要修改一个被其它类包含的类的行为时,它可以代替子类化方法. 一.基本实现下面我把类的结构图向大家展示如下: 让我们简单分析一下上面的结构图,Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知

php Builder建造器模式学习笔记

思路:既然星际的画面由几个部分组成:地图(就是地形和矿产),建筑,部队.那么我们把他们看成是零件,组装起来就是最后的产品(整个画面). 建造器(Builder)模式示例:  代码如下 复制代码 <?php //规范制造各个零件的接口 interface Builder {   //制造地图零件   public function buildMapPart();   //制造建筑零件   public function buildBuildingPart();   //制造部队零件   publi

PHP设计模式之装饰器模式

装饰器设计模式适用于下列工作场合: 需求变化是快速和细小的,而且几乎不影响应用程序的其他部分.() 使用装饰器设计模式设计类的目标是: 不必重写任何已有的功能性代码,而是对某个基于对象应用增量变化. 装饰器设计模式采用这样的构建方式: 在主代码流中应该能够直接插入一个或多个更改或"装饰"目标对象的装饰器,同时不影响其他代码流. <?php        class CD {            public $trackList;                        

枚举器模式(Enumerator pattern)

如何使用枚举器模式(Enumerator pattern): 1.  如果你要实现IEnumerable.GetEnumerator,你也要实现一个GetEnumerator方法的非虚方法版本.你的枚举器类的IEnumerable.GetEnumerator方法应该调用这个非虚方法.如下所示应该返回一个内嵌的枚举器结构: ·                           class MyClass : IEnumerable ·                           { · 

php设计模式介绍之装饰器模式

若你从事过面向对象的php开发,即使很短的时间或者仅仅通过本书了解了一些,你会知道,你可以 通过继承改变或者增加一个类的功能,这是所有面向对象语言的一个基本特性.如果已经存在的一个php 类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类 -这建立在额外的代码上. 但是产生子类并不总是可能或是合适的.如果 你希望改变一 个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于 运行时完成,后者显然时可能的,但是可能会导致

Python的装饰器模式与面向切面编程详解

  这篇文章主要介绍了Python的装饰器模式与面向切面编程详解,概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能,本文详细了装饰器模式的方方面面,然后引出面向切面编程知识,需要的朋友可以参考下 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 1

Win8新界面设备管理器中安装驱动

Windows 8在功能上的最大亮点就是新界面及新界面应用,硬件设备驱动在新界面中也能够顺利的安装和使用.具体方法如下: 第一步:鼠标移动到右上或者右下角,在侧边栏单击"设置". 第二步:在"设置"中,单击最下方的"更改电脑设置". 第三步:在Windows 8新界面的"设备"中,单击"添加设备". windows8教程 第四步:Windows 8会自动扫描硬件,然后在列表中显示识别记过.首先将会搜索Win

php中注册器模式类的使用

php中注册器模式类的使用     注册器读写类 Registry.class.php     <?php/**  * 注册器读写类  */class Registry extends ArrayObject{    /**      * Registry实例     *     * @var object      */    private static $_instance = null;     /**     * 取得Registry实例     *      * @note 单件模式