程序员们有福了:独立于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个部分:视图、感受器、业务中枢、数据模型、效应器。业务中枢就相当于业务层,数据模型就相当于数据层。框架独立于视图,我们平时的主要工作就是:
- 定义感受器来感知视图的行为。
- 感受器通知业务中枢,业务中枢改变数据模型或者协调各个业务中枢之间的关系。
- 定义效应器,绑定数据到指定视图。
从上面可知,只有感受器和效应器才和视图有关系,一个是监控视图行为、一个是为视图提供数据。为了和视图独立,我们通过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为大家做了以下这些事情:
- 以Annotation的方式定义了和视图交互的方法,同时独立于视图。
- 把程序分为几个部分,每个部分都有自己专门职责,结构清晰。
- 自动数据绑定
- 业务对象自动注入。
好了,今天就简单说到这,Reflex现在还只是个雏形,离真正实用还有很大的距离,但是我会改进的。虽然这么说,但我个人力量有限,如果谁有兴趣一起进步,项目在这里,在此万分感谢。
转载于:https://www.cnblogs.com/simplevita/p/4596340.html
程序员们有福了:独立于GUI的Java应用框架 Reflex 诞生了!相关推荐
- 为了转行程序员而努力的第三十九天- Java SSM框架,线程
今天正常醒了,因为昨天起晚了,导致上午很快就过去了,今天决定早点起床,突然有这么长几乎没有人打扰的假期真是太难得了,以至于有时候都不知道该做什么,每到晚上的时候又感慨居然这么快又过了一天.今天提前学习 ...
- Java程序员已经饱和了,还有必要培训Java编程嘛
自从互联网时代到来,现今的格局已经渐渐明朗:实体.互联网.人工智能.它们分别代表着不同领域:过去(实体),现在(互联网),未来(人工智能). 大家公认为做Java程序员,工资高,加薪快?没错,现实的确 ...
- 五年程序员败在阿里三面,还是Java底层原理的问题啊!
经常听到一些同学调侃,Boss不聘.前程堪忧.拉不上钩,简历投了上百份,好不容易收到的面试又一个一个被刷掉,这阵仗在互联网IT行业太常见了.身边一朋友就找我聊了. 他小厂背景.15年毕业.普通学校,这 ...
- java程序员需要考证_泄题了!Java程序员最可能被考到的14个面试题
作为程序员在面试的时候碰到的问题还是很多的,不光要掌握像数组.链表.栈.队列和树这样基本的数据结构,在面试中还会碰到数据结构和算法问题.所以小编在这里告诉大家,下面的面试题目很有可能被碰到,一起来看看 ...
- 《Java程序员面试秘笈》—— 第1章 Java编程基础
本节书摘来异步社区<Java程序员面试秘笈>一书中的第1章,作者:常建功,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第1章 Java编程基础 通过考察Jav ...
- java属于编译_《程序员修炼之道》-读书笔记一-Java到底属于编译型语言还是解释型语言?...
Java到底属于编译型语言还是解释型语言? 要想知道Java属于编译型语言还是解释型语言我们需要知道他们的定义和区别 定义: 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运 ...
- 2020年12月程序员工资统计,平均14222元,Java排名靠后!
来源:有数可据 blog.csdn.net/juwikuang/article/details/110779857 2020年12月全国招收程序员394699人.2020年12月全国程序员平均工资14 ...
- Java业务面考什么_Java程序员面试技巧分享,面考官考查JAVA程序员常用的技术有哪些?...
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能呢?面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西. 大家可以把 ...
- 从事程序员的工作,Python大数据、Java、前端,哪个有发展前景?
首先我说大数据,现在有很多培训机构培训大数据,根据我多年的从业经验来看,大数据这名字听着不错,好像很高大上.但所谓培训"零基础"的.没有做过开发的人去学习大数据,就跟过家家是一样的 ...
最新文章
- 最详细的JavaScript和事件解读
- 树形dp——树的重心(2) 代码调试理解
- Windows Server 8 Beta 初体验之三 Active Directory
- 数据预处理之独热编码(OneHotEncoder)
- 「仅凭照片就能判断一个人是否犯罪」?这样的研究能发表,LeCun、MIT谷歌等机构的1700名研究者怒了...
- 万字长文 | 一文带你读懂账号体系
- 【python 学习】知识点日记
- 实现自己的BeanFactory、AOP以及声明式事务
- hive metastore mysql_Hive MetaStore的结构
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
- PHP curl get post通用类
- python 私有云_构建私有云伴随着哪些需求?
- android 区域交错,android - 自动调整交错GridLayoutManager - 堆栈内存溢出
- PPC WM5 输入法屏蔽插件
- 脱式计算机在线使用,脱式计算练习题.doc
- 计算机专业对体重有要求吗,毕业季|@毕业生,你知道计算机学院有多重吗?
- .net学习笔记——学生信息管理系统(一、在SQL server中新建学生信息库)
- 【Linux】查看网络接口(ifconfig | nmcli)
- 数据埋点是什么?设置埋点的意义是什么?
- 认知网络知识点及例题总结
热门文章
- rehat linux设置ip,RedhatHat配置IPv6地址
- 5种JavaScript中常用的排序方法
- 声音处理之-梅尔频率倒谱系数(MFCC)
- python3 open()内置函数
- javascript 数组以及对象的深拷贝方法
- python爬虫挖掘平台搭建_一篇非常棒的安装Python及爬虫入门博文!
- 面试题整理 4 合并两个排序的数组
- 【自动驾驶】31.【相机外参标定】、【相机障碍物后处理】【地面的2D点反投影到3D】的过程对比
- 【Socket网络编程】17. recv() 函数详解
- 敏捷开发的45个好习惯