程序员们有福了:独立于GUI的Java应用框架 Reflex 诞生了!

如今,你们用java开发最多、最火的应用是基于什么GUI?Andorid!应该没有人不知道!那你知道还有Awt、Swing、Swt、JavaFx吗?虽然它们主要是用于开发桌面应用的,不过也不全对,JavaFx也是能够导出为手机应用的。Whatever,无论它们面向什么平台,它们都是基于Java的 GUI的工具包或者框架,随着技术的发展,还会有愈来愈多的GUI工具会出现,这是必定的。难道咱们这些程序员们就这么苦逼,每次的技术更新,咱们都须要从新从0开始么?答案是NO!就像咱们人类同样,虽然每一个人都长得不同,可是内部有同样的东西,使得咱们能够思考、交流和行走。咱们须要把GUI剥离,把那些永恒的东西进行提炼,这就是Reflex框架的目的。因此我说你们有福了,让咱们抓住永恒和核心的东西,以不变应万变,这样,无论GUI再怎么变,都是so easy!java

Reflex的中文意思是反射,整个框架是按照反射弧模式建立。没错,就是咱们初中生物课本上学过的反射弧。你们若是有兴趣,能够去百度百科上温故而知新。我如今先简单说说它的结构,尽可能不要陷入太多理论。为了你们有个直观认识,这篇文章主要仍是以一个简单的Hello World 示例为主。android

Reflex框架把一个应用程序分为5个部分:视图、感觉器、业务中枢、数据模型、效应器。业务中枢就至关于业务层,数据模型就至关于数据层。框架独立于视图,咱们平时的主要工做就是:git

  1. 定义感觉器来感知视图的行为。
  2. 感觉器通知业务中枢,业务中枢改变数据模型或者协调各个业务中枢之间的关系。
  3. 定义效应器,绑定数据到指定视图。

从上面可知,只有感觉器和效应器才和视图有关系,一个是监控视图行为、一个是为视图提供数据。为了和视图独立,咱们经过Annotation来指定视图就行啦。程序员

废话再也不多说,之后有兴趣,你们能够慢慢了解。简单粗暴,上图先。github

 

这个例子很简单,在视图上有两个元素,一个是按钮,一个是文本。操做是这样的:点击按钮,在业务中枢里面有个记数,每点一下,记数就增长1。文本显示的就是”Hello World”加上业务中枢中的记数。以下图:算法

能够看到,点击按钮,文本显示就自动更新。监控按钮点击的代码是这样:框架

@Receptor
public class BtReceptor {
    
    /**
     * 自动注入业务中枢 ,经过接口访问业务中枢
     */
    @Autowired
    private IHelloCenter helloCenter;
    
    /**
     * 感觉对象是  id为bt的视图,行为刺激是: click 事件.
     * @param view
     */
    @Recept(target="bt", stimulation="android.view.View$OnClickListener")
    private void onRemoveBtClicked(View view)
    {
        helloCenter.changeCount();
    }
}

咱们不须要手动建立感觉器对象,在感觉器类上用@Receptor标记,框架会在适当的时候自动建立该对象。onRemoveBtClicked方法上,有一个Recept注解,它定义了监听的视图和接口。视图和接口目前都是用字符串的形式表示,目的是 为了通用。在不一样的gui框架里,须要不一样的匹配算法来匹配视图。在android,这里的bt,就会自动匹配R.id.bt 这个按钮。至于接口,目前只支持写全接口,有点繁琐,是否是? 之后想办法解决。给定行为接口后,这个被注解的方法就至关于该接口的回调函数。在此例中,监控到按钮被点击后,就调用业务中枢的changeCount方法。ide

业务中枢由于@Autowired的关系,在BtReceptor被实例化的时候,会自动注入业务中枢对象。它的具体实现是这样:函数

@Center
public class HelloCenter extends BindableAware implements IHelloCenter,  Initializable {

    private int count = 0;
    
    @Override
    public void changeCount() {
        count ++;        
        invalidateBind("hello");
    }

    @Bindable(name="hello")
    @Override
    public int getCount() {
        return count;
    }

    @Override
    public void onInitialized() {
        
    }
}

功能上很简单,很少说,就是增长一个计数。须要说明的数据绑定,业务中枢须要继承BindableAware这个类,它有一个方法,invalidateBind。调用invalidateBind方法就能够通知外部,什么失效了。在此例中就是名为hello的数据绑定失效了,须要从新更新。而名为hello的数据绑定和getCount方法对应,也就是说getCount方法过期了。工具

好比效应器的代码就调用了getCount方法:

@Effector
public class TextEffector {

    /**
     * 自动注入业务中枢 ,经过接口访问业务中枢
     */
    @Autowired
    private IHelloCenter helloCenter;
        
    /**
     * 效应对象是  id为text的视图,效应方位是 text属性.
     * @param view
     */
    @Effect(target="text", site="text")
    public String getHelloText()
    {
        return "hello world " + helloCenter.getCount();
    }
}

此时框架会从新调用getHelloText方法,而后把结果赋予给R.id.text的视图,这样就完成了整个流程。例子程序完整代码在这里

其实,代码量不是不少,结构还很清晰,是否是很简单?简单概括一下,Reflex为你们作了如下这些事情:

  1. 以Annotation的方式定义了和视图交互的方法,同时独立于视图。
  2. 把程序分为几个部分,每一个部分都有本身专门职责,结构清晰。
  3. 自动数据绑定
  4. 业务对象自动注入。

好了,今天就简单说到这,Reflex如今还只是个雏形,离真正实用还有很大的距离,可是我会改进的。虽然这么说,但我我的力量有限,若是谁有兴趣一块儿进步,项目在这里,在此万分感谢。

相关文章
相关标签/搜索