程序员们有福了:独立于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為大家做了以下這些事情:
好了,今天就簡單說到這,Reflex現在還只是個雛形,離真正實用還有很大的距離,但是我會改進的。雖然這么說,但我個人力量有限,如果誰有興趣一起進步,項目在這里,在此萬分感謝。
轉載于:https://www.cnblogs.com/simplevita/p/4596340.html
總結
以上是生活随笔為你收集整理的程序员们有福了:独立于GUI的Java应用框架 Reflex 诞生了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POST 变为AJAX提交代码。
- 下一篇: 我的Java开发学习之旅------Ja