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

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

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

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

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

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

废话不再多说,以后有兴趣,大家可以慢慢了解。简单粗暴,上图先。

这个例子很简单,在视图上有两个元素,一个是按钮,一个是文本。操作是这样的:点击按钮,在业务中枢里面有个记数,每点一下,记数就增加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方法。

业务中枢因为@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现在还只是个雏形,离真正实用还有很大的距离,但是我会改进的。虽然这么说,但我个人力量有限,如果谁有兴趣一起进步,项目在这里,在此万分感谢。

时间: 2024-12-22 18:12:08

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

程序员成长系列(一):手里必须有一套自己的框架

转眼间工作三年了,对于程序员来说,三年算是这个行业的第一道坎.回首过往,大多都是进行重复性的工作,偶尔的也会进行技术攻关,但是没多久就忘记了,除了找工作的时期,平时是不会理会的. 不知不觉间发现自己这是在通货膨胀中不断贬值. 只要还有精力,学个五年十年那都不是问题,问题是这五年十年都学了些什么.经过多天的考虑,有必要整理一下这三年的所学所得,而且手里必须得有个拿得出手的东西.于是有必要整理一套自己的框架,而且吃透弄熟,把一些常用的功能组件都剥离出来,对以后无论是做管理还是搞技术都有莫大的帮助.

成为专业程序员路上有用的各种优秀资料、神器及框架

目录 资料篇 技术站点 必看书籍 大牛博客 GitHub篇 工具篇 平台工具 常用工具 第三方服务 爬虫相关(好玩的工具) 安全相关 Web服务器性能/压力测试工具/负载均衡器 大数据处理/数据分析/分布式工具 Web前端 语言篇 Scala Java Python Swift .NET C & C++ 其他 游戏开发相关 日志聚合,分布式日志收集 RTP,实时传输协议与音视频 资料篇 技术站点 在线学习:Coursera.edX.Udacity.MIT公开课.MOOC学院.慕课网 Hacker

程序员如何用思维导图高效学习Java编程

Java作为一种常见的计算机编程语言,它具有简单.稳定.多线等特点,被广泛运用于PC.游戏控制台.数据中心.超级计算机以及互联网,相对于C++,Java会稍微容易些,但是依然需要我们学会很多的编程,作为一名程序员,如何系统的掌握这些程序呢?下面是分享的用思维导图学习Java编程方法介绍,一起看看吧! 为什么要用思维导图学习Java呢? 首先思维导图是一种结构性模型,有利于整合知识框架,其次,思维导图是一种带色彩的图文结合,相对于单纯的文字而言,更好的被人们所记住,迅捷画图作为一款好用的思维导图工

程序员必备:那些GitHub上最受欢迎的框架你收藏了几个?

转眼间2020年已经过去了近两个月,在祈祷疫情尽快消散的同时,大家也不要忘了学习啊! 众所周知前端开发是一个综合性比较强的编程工作,前端开发人员不仅需要一定的审美观和设计观,同时还需要精通诸如HTML.CSS.JavaScript等错综复杂的技术.因此,在前端开发工作中,借用一些开发框架往往能达到事半功倍的效果. 今天的文章小渡为大家搜罗了数十款目前最受程序员欢迎的前端CSS框架,其中有的霸榜已久,也有不少后起之秀,有的是单纯的CSS框架,也有的结合了JavaScript以提供更丰富的功能.一起

【架构师技巧分享】程序员面试美团:面试官突然问Java “锁”你应该怎么回答?

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识.下面给出本文内容的总体分类目录: 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度.在Java和数据库中都有此概念对应

程序员必知的8大排序(java实现)

8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. (2)实例 (3)用java实现 package com.njue; public class insertSort { public insertSort(){      inta[]={ 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49

而立之年——三线城市程序员的年终告白

30岁(2017-1987),曾经对我来说曾是个多么遥远的数字,但它正悄然的离我越来越近.古人云,三十而立,而立的意思是自立于世,多指学有所成. 在<于丹的〈论语心得〉>里,"立"是内心的的立,是内在心灵的独立,而不是十岁的无知,二十岁的愤青,三十真正追求的是心灵的自信和坚定,在你的生命里树立清楚的自省,从容不迫的生活态度,忠于自己的心灵. 当我敲下于丹的解释,我的内心是颤抖的.思虑万千,久久不能释怀.刚翻看了自己13,14,15年年底的年终总结,当年的跌宕起伏的往事,感觉

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

如何成为强大的程序员(转)

add by zhj:我怎么总感觉在说我啊,最切我要害的两点:分析瘫痪.羞于请求帮助.看来这两个问题有普通性啊,并不是我独有的,哈哈,看来我没有必要为此而过分自责了. 转变总是需要一个过程的,要给自己时间,不要太苛求自己,欲速则不达,当对自己的要求超过了自己的能力时往往会导致压力和焦虑,人在成功前总是会犯很多错的. 原文:http://www.aaronstannard.com/post/2013/02/06/10-Reasons-Why-Youe28099re-Failing-to-Reali