程序員們有福了:獨立於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如今還只是個雛形,離真正實用還有很大的距離,可是我會改進的。雖然這麼說,但我我的力量有限,若是誰有興趣一塊兒進步,項目在這裏,在此萬分感謝。

相關文章
相關標籤/搜索