锁定老帖子 主题:可配置权限的图形用户界面框架的分析和实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||
---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||
发表时间:2008-11-04
最后修改:2008-11-04
1. 前言作为一个图形用户界面开发人员,都会被繁复的界面呈现权限逻辑困扰过,多年来,界面开发的编写方式没有太大的改变,界面程序中总是掺杂着许多条件判断语句,本文的目的就是对这种问题的分析和解决。
希望对这种类型的GUI框架有研究的网友能发表自己的看法,多多交流。 2. 切入点本文的切入点在于根据不同的条件判断语句显示控件,这是界面逻辑的主体。 3. 阅读要求需要阅读者基于GUI框架写过程序,诸如MFC, VCL, wxWidgets,或者struts, webwork之类,其他语言的GUI框架也行。 4. 第一阶段--现状仍然用我的老朋友--请假单作为案例,以下人名纯属虚构,如有巧合,纯属偶然。一张请假单在普通员工填写时,请假原因一栏是可读写的。
但是当部门经理和其他角色阅读时,为只读状态。 如果是用编程语言实现权限判断,那么伪码为
如果是struts,那么标签伪码为
通过上面的例子,我们看到为了在两种角色下分别呈现请假原因控件,写了两段,可以联想到如果有更多的角色要查看同一个页面时会发生什么事--更多的权限判断代码+更多的同id控件输出,就算封装得再漂亮,但只要不改变这种写代码的本质,情况就不会改变。这种同一个id的控件写上多次的情况,是造成编码量急剧增加且难以维护的主要原因。 5. 第二阶段--分析和实现要实现权限可配置,除非权限也是对象,那么干脆就假设权限是对象,定义相关规则如下。 l 将权限作为独立对象。 那么将上面的代码用对象模型用来表达,如下 同时也要解决同名id控件的重复性问题,则假设控件可以根据权限自动决定如何呈现界面,相同id的控件实际只为1个。那么对象模型就变成下面的图
很容易看出,现在的我们只是要对权限和控件两坨对象之间进行逻辑关联,以确定如何呈现界面。 再定义出如下几条规则,以方便编写代码:
l 控件使用权限对象引用来和权限对象绑定。 l 将权限引用包含到控件内。
现在,伪码变成这样
似曾相识吧?没错,类似Ant里Path和PathRef标签的写法。 现在代码完全的对象化了,结构清晰。控件越多这种写法的优势越明显。... 当然,上面的规则不是很完整,为了能够实现控件自决定呈现,得加上几条:
l 权限值有 读写、只读、隐藏、禁止 四种。 l 权限值为读写时调用控件的界面呈现方法。 l 权限值不为读写时由控件在内部决定类型转换,然后调用转换后对象的呈现方法--默认情况下只读转换为文本,隐藏转换为hidden标签,禁止则删除该对象。
这样的规则复杂度一般般,要想实现把呈现的变换隐藏到控件内部,则将权限值当作独特的状态值来看待,使用《设计模式》中的状态模式就可以了。
到目前为止,离实用还有点距离,灵活性还不够,因为在权限改变时,控件的属性会改变,比如,对于提交按钮来说,提交时的javascript处理函数会改变,假设需求如下:
因此再订一条规则来包容属性变化: l 允许在权限匹配时,修改控件的属性。 假设我们有如下需求 下面是示例代码
现在对上面的代码说明。
HTMLAttributes是SubmitButton标签对应的处理类SubmitButton的属性,类图如下 大部分开源框架配置文件xml元素对应的处理类都是这么写的,规则为: l 同名的标签对应同名的类。 l 同名的属性对应同名的参数或者子标签。 在这里,HTMLAttributes子标签里的所有参数,将原封不动的生成为HTML字符串(也可以考虑支持EL表达式),在权限引用(RightRef)标签里,子标签field表示,符合本权限时,将 Name参数值对应的控件对象的属性值按照反射规则重写。用java伪码表达就是
虽然可实现本例的功能,但可以看出这段伪码是有缺陷的,完整的反射设置代码会复杂得多。
至此,我们拥有了完全对象化而且可配置的模型,这个模型完全可以不用在界面程序(这里用jsp,但可以是其他语言的界面程序文件)中硬编码权限,可以考虑两种整体解决方案: l 方案1:仍然在Jsp中写控件代码(这样原有标签可以不改,改后台实现即可),然后把权限标签和权限引用标签独立到另一个xml文件(此时权限引用标签作为权限标签的子标签或者独立标签均可)。
l 方案2:把控件、权限、权限引用全部放到一个xml中进行,jsp退化为模板,好处是可以实现整体式GUI框架,需要跨平台GUI库的话很合适。
本概念还有很多需要强化的地方,将在下一阶段(强化)来讲解,敬请关注,如果我不偷懒的话,会尽快补充的。
文章刚发时犯了个错误,图片地址是C盘,真是囧,好朋友提醒了我,现在修正了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||
返回顶楼 | |||||||
浏览 3015 次