程式員們有福了:獨立於GUI的Java應用程式框架 Reflex 誕生了!

來源:互聯網
上載者:User

標籤:

現在,大家用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”加上業務中樞中的記數。如:

可以看到,點擊按鈕,文本顯示就自動更新。監控按鈕點擊的代碼是這樣:

@Receptorpublic 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被執行個體化的時候,會自動注入業務中樞對象。它的具體實現是這樣:

@Centerpublic 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方法:

@Effectorpublic 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現在還只是個雛形,離真正實用還有很大的距離,但是我會改進的。雖然這麼說,但我個人力量有限,如果誰有興趣一起進步,項目在這裡,在此萬分感謝。

程式員們有福了:獨立於GUI的Java應用程式框架 Reflex 誕生了!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.