`
wuhaidong
  • 浏览: 357929 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

UI工厂概念介绍

    博客分类:
  • NC
阅读更多

总体介绍:

UI工厂是一套基于NC-UAP的UI开发框架。它的产生同构对大量的业务节点的总结,把常见的UI进行分类,分别抽取其中公有的代码,形成不同的UI基类。UI工厂综合运用了单据模板,查询模板,打印模板,实现对这些基本构件得到运用的最优化。UI工厂提供给了UI相关的常见任务的推荐实现方法,比如通过ButtonManager来统一管理界面按钮的状态,使代码更清晰可读,等等。

 


基本介绍:

UI工厂基本策略就是:细分职责,高度重用。仔细分析客户端的各种功能可以发现,有些功能间有较强的相互关联,而这些功能与其他功能间的关联也是。对这些有较强的功能一般陈其具有一定的内聚性。UI工厂中把客户端的各种功能根据其内聚性分成若干组。针对每组功能,都抽象出一个Class来负责这部分“职责”。比如一个Buffer来专门负责缓存多张单据和翻页等相关任务;ButtonManager负责处理创建按钮以及维护按钮的状态。

 

UI : 继承ToftPanel , 功能节点注册需注册该类,是一个节点的入口类。在UI工厂的框架中,相当于Mediator角色。

ButtonManager : 按钮管理器,负责按钮的创建和运行期状态控制。

 

BusinessDelegator : 业务委托类,负责和后台进行交互。除了BusinessAction中的任务,其他所有的和后台交互,即对XXXBO_Client调用都必须放到该类中,其他类必须通过这个Delegator与后台交互。

 

IController : 界面控制器。不要把它和MVC模式中的"C"之间划上等号,它在这里相当于一个配置文件的作用。在使用具体的模式时都有对于IController实现,使用者需要根据实际情况补充其中的信息。

 

 

EventHandle : 按钮事件处理器。所有对按钮事件的处理都在这个类实现。

 

BusinessAction : 业务动作处理类。处理保存、审批等“业务”动作。

 

HYQueryDlg :查询对话框。支持增加常用条件页签。

 


单据模型:

主子表:也就是UI工厂的默认形式。这种情况不需特别的配置。只需实现IControllerBase.getBillVOName()方法,通过一个String数组返回聚和VO,主表VO,子表VO的ClassName即可。

 

多子表:有多个子表这种情况需要继承专门的多子表基类,在IControllerBase.getBillVOName()的方法里依次返回聚合VO,主表VO,子表VO1...... 的ClassName即可。其中聚合VO需要实现IExAggVO接口。

 

单表头:没有表体的卡片。实际实现时把聚合VO的子表当成NULL处理。需要让UI的Controller实现ISingleController接口。并在isSingleDetai方法返回false。

 

单表体:没有表头的卡片。一般用于一些基本档案节点。实现时把聚合VO的主表当成NULL处理。需要让UI的Controller实现ISingleController接口。并在isSingleDetail方法中返回true。

 

BillUIBuffer:

在很多节点中需要对多张单据进行浏览、操作;在执行完一个查询任务后返回的结果也是很多张单据;这就要求客户端有个单据的缓冲区,用户可以操作其中的任何一个单据而不必去每次都去后台查询相应的数据。BillUIBuffer被设计出来完成这个任务。这是一个“线性”的缓冲,其内部是把多个单据保存在一个ArrayList中,有一个名为CurrentRow的指针,其所指的单据就是当前用户所选的单据,如果想通过程序选择特定的单据,只需调用BillUIBuffer.setCurrentRow即可。

 

BillUIBuffer和UI共同实现了一个Observer模式。前者作为一个Observable的子类允许后者对其的“Observing”。当BillUIBuffer的数据发生改变时,比如setCurrentRow被调用,它会通知UI刷新界面数据。对单据进行浏览的功能,比如上一页,下一页等就是调用setCurrentRow来实现的

BillUIBuffer在UI工厂中的角色不能上直接和MVC模式中的Model划等号,其在UI工厂中的角色主要是一个Buffer,而不是一个Model。当对单据进行编辑时,通过BillUIBuffer.getCurrentVO() 得到VO并不是你在界面上看到的数据,这是因为当进行编辑操作时,界面上的数据和BillUIBuffer实际上“脱钩”了的。只有编辑完,保存后,BillUIBuffer才能更新。

 

 

加载界面:

UI工厂的AbstractBillUI对加载界面做任何的封装。真正的界面的加载工作都是由具体的子类,比如卡片界面来实现的。NC中的UI大多是基于单据模板实现的。要使用单据模板便少不了加载模板,设置模板各项参数等“苦差事”。于是BillCardPanelWrapper和BillListPanelWrapper被设计出来专门处理卡片式和列表式的单据模板的加载及设置工作。另外这两个Wrapper提供了一些单据模板自身不够完善的功能,比如按行执行公式等等。

 

上述的两个Wrapper是UI工厂的两个重要的基本工具类,但是其也可以被独立于UI工厂使用。只需提供合适的Controller,Wrapper就能完成单据模板的加载和设置。通过调用getBillCaardPanel可以得到单据模板类的实例,这个Panel可以被放到其他任何Panel或者Dialog中。

 

按钮: 

UI工厂通过ButtonManager统一管理按钮的创建和状态。具体的业务节点不负责创建各个ButtonManager的实例,而是通过一个ID号来向ButtonManager注册一个按钮,ButtonManager会对所有该节点注册的按钮生成一个实例,业务代码可以使用按钮ID向ButtonManager获取对应按钮的实例。具体vde业务节点不负责控制按钮的可用与不可用,而是配合UI状态来设置按钮的“可用策略”的。对每一个按钮可以设置当UI处于何种状态时按钮是可用的。当程序运行时ButtonManager自动根据UI状态变迁来设计各个按钮的可用与不可用。通常,在刷新单据数据时会根据UI相关状态和扩展状态重新自动设置按钮的“可以策略”,如果单据和平台相关,还需要根据相关状态设置按钮“可以策略”。确保后者的方法是使单据UI控制类的isExistBillStatus方法返回true。

 

UI工厂预先注册了很多常见的按钮,比如新增,编辑,保存等等。这些按钮的显示名称,状态信息,热键以及策略都是预置好的,一般各个业务节点不需要修改。如前文所述,每一个按钮有一个ID号与之对应。比如新增为(Add)、查询(Query)完整的列表可以参看IBillButton的定义。业务节点根据实际的需要可以指定需要哪些按钮,当程序初始化时ButtonManager会负责把这些按钮创建出来。比如对于基于“卡片界面”实现的节点可以在ICardController.getCardButtonAry()指定需要的按钮。

 

每个Btn的配置信息保存在ButtonVO中,在ButtonObject.getData可以得到整个ButtonVO,对特定按钮的可用策略的修改可以通过得到该按钮一个实例修改ButtonVO的值。

 

 

 

 

 

分享到:
评论

相关推荐

    NC57UI工厂文档

    单据模型是UI工厂中的核心概念之一,用于描述不同类型单据的结构和行为。 1. **卡片型单据**: - 类结构:包括卡片型单据的基础类、继承类等。 - 界面示例:展示卡片型单据的外观设计。 - 开发步骤:前期准备、...

    用友ERPUI工厂文档

    - **概念**: 单据模型是UI工厂中的一个重要组成部分,用于描述业务逻辑中的单据数据结构及相关的操作行为。 - **组成**: 单据模型通常包括单据的结构设计(字段定义、数据类型等)、业务规则(校验逻辑、计算公式等...

    jquery.ui.widget.js

    首先,我们需要了解jQuery UI Widget的基本概念。Widget工厂是jQuery UI的核心,它为创建可复用、可配置且具有完整生命周期的UI组件提供了基础。通过使用Widget工厂,开发者可以方便地定义组件的行为、状态和外观,...

    c#简易UI计算器(加减乘除指数对数)

    通过以上分析,我们可以看出这个“c#简易UI计算器”项目不仅涵盖了C#的基础知识,还涉及了设计模式、图形用户界面开发、配置管理和面向对象编程的高级概念,是一个很好的学习和实践C#编程技能的实例。

    用抽象工厂做的一个计算器

    在ASP.NET的页面生命周期中,根据用户的请求,相应的工厂会被调用,创建出计算器的UI元素,并将其绑定到页面上。 对于ASP.NET的计算器,可能还包括对HTTP请求的处理,将用户点击按钮的事件转化为服务器端的计算请求...

    C# Winform抽象工厂架构

    在IT行业中,设计模式是软件开发中的重要概念,它们提供了在特定情况下解决常见问题的蓝图。"C# Winform抽象工厂架构"是一个基于C#语言和Windows Forms(Winform)平台,利用抽象工厂设计模式构建的多层架构项目。在...

    jquery-ui-1.9.2

    jQuery UI 的核心概念** - **Widget Factory**: jQuery UI 的核心是 Widget Factory,它是一个强大的机制,用于创建可复用、可配置且具有完整生命周期的 UI 组件。开发者可以通过这个工厂轻松地创建自定义组件。 ...

    AngularJS UI Development

    - **版本发展**:AngularJS最初版本于2010年发布,随着技术的发展,Google推出了Angular 2及后续版本,虽然这些新版本与AngularJS并不完全兼容,但它们共享了许多相似的概念和技术。 #### 知识点二:AngularJS中的...

    C#抽象工厂模式

    总的来说,这个C#项目展示了如何利用抽象工厂模式来创建和管理具有不同主题的UI组件。通过这种方式,我们可以轻松地切换应用的主题,只需要改变使用的工厂即可,而无需修改使用这些组件的业务逻辑代码。抽象工厂模式...

    iOS设计模式-工厂方法

    在使用时,我们可以根据需要选择合适的工厂来创建UI组件,这样即使添加新的组件类型,也只需要添加新的工厂类,而不会影响已有的代码。 **总结** 工厂方法设计模式在iOS开发中有着广泛的应用,特别是在需要动态地...

    iOS 抽象工厂模式demo + 用例图+工厂模式资料。

    2. **角色分析**:介绍模式中的四个主要角色——抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)、抽象产品(Abstract Product)和具体产品(Concrete Product)。 3. **模式结构**:描述这些角色之间...

    asp.net 抽象工厂分层框架

    ASP.NET 抽象工厂分层框架是一种常见的软件设计模式,用于在ASP.NET应用程序中实现灵活、可扩展的架构。...在ASPNETDemo项目中,你可以看到这些概念如何实际应用于代码中,从而更好地理解和学习这一框架。

    AS 实现的工厂模式

    首先,我们了解工厂模式的基本概念。工厂模式的核心思想是提供一个接口或抽象类来创建对象,而具体的实例化过程则由子类负责。这样,当需要创建新类型的对象时,无需修改已有的代码,只需要添加新的子类即可,符合开...

    ASP.NET抽象工厂

    在Session4的文件中,可能包含了具体实现这些概念的代码示例,如DBHelper的实现、三层架构各层的类定义,以及如何使用抽象工厂模式来创建数据库连接。通过学习这些代码,开发者可以深入理解如何在实际项目中应用ASP...

    AbstractFactory 抽象工厂

    通过抽象工厂模式,我们可以将与平台相关的代码(如Windows或MacOS的UI元素创建)封装在具体工厂类中,而客户端代码只需与抽象工厂交互,从而实现平台无关性。这使得系统更具可扩展性和可维护性。 在实际项目中,...

    抽象工厂模式(Abstract Factory Pattern)

    在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建过程更加灵活且易于维护。通过避免直接指定类名创建对象的...

    c#抽象工厂接三层结构

    在IT行业中,设计模式是软件开发中的重要概念,它们提供了在特定情况下解决常见问题的蓝图。"抽象工厂"是设计模式之一,属于创建型模式,主要用于创建一系列相关的对象,而无需指定具体类。在这个名为“c#抽象工厂接...

    asp.net c#面向对象虚拟工厂程序

    在ASP.NET C#项目中,虚拟工厂可以用来动态地创建UI组件或业务对象的实例,根据需求或配置文件选择不同的实现。这增加了代码的灵活性,使得扩展和替换变得更加容易。 总的来说,“asp.net c#面向对象虚拟工厂程序”...

    c#三层工厂模式(带数据库)

    三层架构是一种常见的软件设计模式,它将应用程序分为三个主要部分:表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。工厂模式是设计模式中的一种,它提供了一种创建对象的最佳方式,使得代码更加灵活且易于...

    移动端游戏UI设计-二部曲

    在Unity3D这个强大的游戏开发引擎中,实现这些UI设计概念相对容易。Unity3D提供了一套完整的UI系统,包括Canvas、EventSystem、UI元素(如Button、Text、Image等)以及各种脚本组件,支持开发者方便地创建和控制游戏...

Global site tag (gtag.js) - Google Analytics