多个IControlFactory之间的数据交互

8年前

多个IControlFactory之间的数据交互

访问普元产品知识库(doc.primeton.com),查看本文原文,获得更多普元产品知识,点击此处


IControlFactory是我们Studio UI框架的核心类之一,被广泛使用在UI开发过程中,其可以总结的地方挺多的,今天先总结一下"数据交互"的问题吧。
这里的交互方式有4种(目前我只能总结这些,有不同意见欢迎大家拍砖);个人建议使用前两种数据交互方式。

IValueContaier与IValueChangeListener

这个应该是大家使用最多的吧,因为IControlFactory既是ValueChangeEvent事件的发送者、也是事件的接收者;不用我说大家也明白将两个IControlFactory通过事件监听的方式连接起来以后,就可以在事件发生时向另一个IControlFactory发送数据了;但是如果两个IControlFactory相互不可见怎么办呢,下面这种传递方式可以有效地解决这种问题。

IValueRepository(上下文环境)

这个东东通常是被忽视的,我却对它一见钟情,我想这个应该是在IControlFactory设计之初预留的一个不错东东。开发过Web程序的同学应该对session不陌生吧,这里的IValueRepository就是我们UI框架里面的session了。

 public interface IValueRepository extends Map     { 	public IValueRepository createSubRepository(String id);  	public IValueRepository getSubRepository(String id);  	public IValueRepository getParentRepository();  	public IValueRepository[] getSubRepositories();  	public Object getAdapter(Class r_Adapter);      } 

看到这个接口,乍一看没什么,请仔细看看,它实现了Map;也就是说我们可以把IValueRepository 当成一个Map使用,同时为可防止数据的干扰,我们还可以为IValueRepository增加子IValueRepository,这样一个数据的上下文环境就建成了。在AbstractControlFactory将更加明显看出这是一个session。

 public abstract class AbstractControlFactory    {         private IValueRepository context;         /** 	 * {@inheritDoc} 	 */ 	public final void initContext(IValueRepository r_Context) { 		this.context = r_Context; 		this.doInitContext(r_Context); 	}  	/** 	 * The derived class should override this method to init the context.<BR> 	 * 	 * @param r_Context 	 */ 	public void doInitContext(IValueRepository r_Context) { 	     //Nothing to do 	}  	/** 	 * @return the context 	 */ 	public IValueRepository getContext() { 		return this.context; 	}    } 

我们在一个对话框或者向导当中,只要IControlFactory没有被销毁,而我们每个IControlFactory使用的是相同的IValueRepository对象(也可以是具有相同父亲的IValueRepository),数据传递随时可以进行,甚至我们还可以监听IValueRepository对象的变化。

"提示"

  1. 具有父子关系的ControlFactory需要通过initContext()方法手动传递上下文环境。
  2. 通常上下文环境是由UI 容器首先创建的,我们没必要自己创建,就像session一样。

CompoundControlFactory

这个传递数据比较局限,因为只有当父类是CompoundControlFactory(也可能是StackControlFactory)时,才有可能拥有多个ControlFactory对象,可以通过父factory传递数据,适用范围非常有限,不建议使用。

setValue()和getValue()

多个IControlFactory可以共用一个值(不建议这么做),这样也可以相互传递数据,因为value是用来显示在控件上的,用来编辑的,再用它作为传递数据的载体实在不是个明智的选择。

"提示"

综上所述建议通过事件监听和上下文环境进行数据传递。

COMMENTS

需要 后方可回复
如果没有账号可以 一个帐号。