现在,大家用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 {/*** 自动注入业务中枢 ,通过接口访问业务中枢*/@Autowiredprivate 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;@Overridepublic void changeCount() {count ++;        invalidateBind("hello");}@Bindable(name="hello")@Overridepublic int getCount() {return count;}@Overridepublic void onInitialized() {}
}

功能上很简单,不多说,就是增加一个计数。需要说明的数据绑定,业务中枢需要继承BindableAware这个类,它有一个方法,invalidateBind。调用invalidateBind方法就可以通知外部,什么失效了。在此例中就是名为hello的数据绑定失效了,需要重新更新。而名为hello的数据绑定和getCount方法对应,也就是说getCount方法过时了。

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

@Effector
public class TextEffector {/*** 自动注入业务中枢 ,通过接口访问业务中枢*/@Autowiredprivate 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现在还只是个雏形,离真正实用还有很大的距离,但是我会改进的。虽然这么说,但我个人力量有限,如果谁有兴趣一起进步,项目在这里,在此万分感谢。

转载于:https://www.cnblogs.com/simplevita/p/4596340.html

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

  1. 为了转行程序员而努力的第三十九天- Java SSM框架,线程

    今天正常醒了,因为昨天起晚了,导致上午很快就过去了,今天决定早点起床,突然有这么长几乎没有人打扰的假期真是太难得了,以至于有时候都不知道该做什么,每到晚上的时候又感慨居然这么快又过了一天.今天提前学习 ...

  2. Java程序员已经饱和了,还有必要培训Java编程嘛

    自从互联网时代到来,现今的格局已经渐渐明朗:实体.互联网.人工智能.它们分别代表着不同领域:过去(实体),现在(互联网),未来(人工智能). 大家公认为做Java程序员,工资高,加薪快?没错,现实的确 ...

  3. 五年程序员败在阿里三面,还是Java底层原理的问题啊!

    经常听到一些同学调侃,Boss不聘.前程堪忧.拉不上钩,简历投了上百份,好不容易收到的面试又一个一个被刷掉,这阵仗在互联网IT行业太常见了.身边一朋友就找我聊了. 他小厂背景.15年毕业.普通学校,这 ...

  4. java程序员需要考证_泄题了!Java程序员最可能被考到的14个面试题

    作为程序员在面试的时候碰到的问题还是很多的,不光要掌握像数组.链表.栈.队列和树这样基本的数据结构,在面试中还会碰到数据结构和算法问题.所以小编在这里告诉大家,下面的面试题目很有可能被碰到,一起来看看 ...

  5. 《Java程序员面试秘笈》—— 第1章 Java编程基础

    本节书摘来异步社区<Java程序员面试秘笈>一书中的第1章,作者:常建功,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第1章 Java编程基础 通过考察Jav ...

  6. java属于编译_《程序员修炼之道》-读书笔记一-Java到底属于编译型语言还是解释型语言?...

    Java到底属于编译型语言还是解释型语言? 要想知道Java属于编译型语言还是解释型语言我们需要知道他们的定义和区别 定义: 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运 ...

  7. 2020年12月程序员工资统计,平均14222元,Java排名靠后!

    来源:有数可据 blog.csdn.net/juwikuang/article/details/110779857 2020年12月全国招收程序员394699人.2020年12月全国程序员平均工资14 ...

  8. Java业务面考什么_Java程序员面试技巧分享,面考官考查JAVA程序员常用的技术有哪些?...

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能呢?面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西. 大家可以把 ...

  9. 从事程序员的工作,Python大数据、Java、前端,哪个有发展前景?

    首先我说大数据,现在有很多培训机构培训大数据,根据我多年的从业经验来看,大数据这名字听着不错,好像很高大上.但所谓培训"零基础"的.没有做过开发的人去学习大数据,就跟过家家是一样的 ...

最新文章

  1. 最详细的JavaScript和事件解读
  2. 树形dp——树的重心(2) 代码调试理解
  3. Windows Server 8 Beta 初体验之三 Active Directory
  4. 数据预处理之独热编码(OneHotEncoder)
  5. 「仅凭照片就能判断一个人是否犯罪」?这样的研究能发表,LeCun、MIT谷歌等机构的1700名研究者怒了...
  6. 万字长文 | 一文带你读懂账号体系
  7. 【python 学习】知识点日记
  8. 实现自己的BeanFactory、AOP以及声明式事务
  9. hive metastore mysql_Hive MetaStore的结构
  10. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
  11. PHP curl get post通用类
  12. python 私有云_构建私有云伴随着哪些需求?
  13. android 区域交错,android - 自动调整交错GridLayoutManager - 堆栈内存溢出
  14. PPC WM5 输入法屏蔽插件
  15. 脱式计算机在线使用,脱式计算练习题.doc
  16. 计算机专业对体重有要求吗,毕业季|@毕业生,你知道计算机学院有多重吗?
  17. .net学习笔记——学生信息管理系统(一、在SQL server中新建学生信息库)
  18. 【Linux】查看网络接口(ifconfig | nmcli)
  19. 数据埋点是什么?设置埋点的意义是什么?
  20. 认知网络知识点及例题总结

热门文章

  1. rehat linux设置ip,RedhatHat配置IPv6地址
  2. 5种JavaScript中常用的排序方法
  3. 声音处理之-梅尔频率倒谱系数(MFCC)
  4. python3 open()内置函数
  5. javascript 数组以及对象的深拷贝方法
  6. python爬虫挖掘平台搭建_一篇非常棒的安装Python及爬虫入门博文!
  7. 面试题整理 4 合并两个排序的数组
  8. 【自动驾驶】31.【相机外参标定】、【相机障碍物后处理】【地面的2D点反投影到3D】的过程对比
  9. 【Socket网络编程】17. recv() 函数详解
  10. 敏捷开发的45个好习惯