亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用Annotations設計一個MVC框架

2019-11-18 12:44:40
字體:
來源:轉載
供稿:網友

  當設計一個應用程序時, 清楚的分離該程序的不同邏輯組件, 總是被證實是有益的. 同時也存在許多不同的模式來幫助開發者實現這個目標。其中最有名同時也最常用的自然是Model-View-Controller (MVC)了, 它能夠將每個應用程序(或者應用程序的一部分)分成三個不同功能的組件,并且定義了把他們聯結在一起的規則。Swing本身就是基于這個模式的,而且每個使用Struts,這個流行的開發Web應用框架的人也都了解隱藏在MVC后面的理論.

  這篇文章介紹了怎么樣通過使用annotation而增加一個新的組件來加強MVC,使其能夠更加方便地去掉models跟views之間的耦合。這篇文章介紹了一個叫Stamps的開源庫, 它是基于MVC組件之上的,但它去除了所有在開發MVC時所需的, 在models, views和controllers之間建立聯系的負擔。

基礎知識: MVC和annotations

  正如MVC這個名字所指出的, Model-View-Controller模式建議將一個應用程序分成以下三個組件:
·Model: 包含了數據模型和所有用來確定應用程序狀態的信息。 它一般來說是有條理的并且獨立于其他組件的。
·View: 從不同于model的角度出發,它定義了存儲在模型中數據的展現方式。它通常被認為是你的應用程序的用戶界面(或者GUI),或者以Web應用為例,場景就是你通過瀏覽器看到的頁面。
·Controller: 它代表應用程序的邏輯部分。在這里,它定義了一個用戶如何和應用程序進行交互并且也定義了用戶行為是如何映射到model的改變。

  這些組件緊密的聯系在一起: 用戶影響view, 反過來view通知controller來更新model.最終model又更新view來反映它的新狀態。圖1就展現了這種典型的MVC結構。

使用Annotations設計一個MVC框架(圖一)
圖1. 一個典型的MVC結構

  作為J2SE 5.0所提供的一個新的功能,annotations答應開發者往classes,methods,fields,和其他程序元素中增加元數據。就像反射機制一樣,之后很多應用程序為了某些原因能在運行時期獲取并使用那些元數據。因為J2SE 5.0只是定義了怎么樣編寫和讀取annotations,并沒有說明在哪里使用他們(象@Override這樣的用于提前定義的例外),開發者擁有無窮多的在許多不同場合使用他們的可能性:文檔編寫,與對象相關的映射,代碼生成,等等.. Annotations已經變的十分流行,以至于大多數框架和庫都更新自己來支持他們。至于更多的關于MVC和annotations的信息請參見資源。

超越MVC: dispatcher

  就像前文提到的一樣,models和views之間的一些耦合是必要的因為后者必須反映前者的狀態。普通java程序使用直接或間接的耦合將組件綁定在一起。直接耦合發生在當view和model之間有一個直接相關的時候,model包含一列需要維持的views。間接耦合通常發生在一個基于事件分派的機制中。Model會在它狀態改變時激發事件,同時一些獨立的views會將他們自己注冊成事件偵聽器。

  通常我們比較青睞間接耦合因為它使model完全不知道view的存在,相反view必須和model保持一定的聯系從而將自己注冊到model上。在這篇文章里我將介紹的框架就是使用間接耦合,但是為了更好的降低組件之間的耦合,view必須不知道model的存在;也就是說,model和view沒有被綁定在一起。

  為了實現這個目標,我已經定義了一個新的組件,就是dispatcher,它能作為一個存在于views和models之間的分離層。它能處理models和views雙方之間的注冊并且分派由model激發的事件到注冊的views上。它使用java.beans.PRopertyChangeEvent對象來表現由model傳送到view的事件;然而,這個框架的設計是足夠開放的,它可以支持不同事件類型的實現。

  治理注冊的views列表的負擔于是就從model上移開了,同時,因為view只和這個獨立于應用程序的dispatcher有關,view不知道model的存在。假如你熟悉Struts內部,你也許能夠看出Struts的controller就是在履行這樣一個任務,它將Actions和他們關聯的jsp(JavaServer Pages)表現頁面聯系在一起。

  現在,我們所設計的MVC框架就像圖2所描述的一樣。Dispatcher在其中擔當了一個于controller相當的角色。

使用Annotations設計一個MVC框架(圖二)
圖2.擁有額外dispatcher組件的改進的MVC框架

  由于dispatcher必須是獨立于應用程序的,所以必須定義一些通用的聯結models和views的規范。我們將使用annotations來實現這種聯結,它將會被用來標注views并且確定哪個view是受哪個model的影響的,及這種影響是怎么樣的。通過這種方式,annotations就像是貼在明信片上的郵票一樣,驅動dispatcher來執行傳遞model事件的任務(這就是這一框架名字的由來)。


應用實例

  我們將使用一個簡單的計秒器應用程序做該框架的一個應用實例:它答應用戶設置時間周期來記數和啟動/停止這個定時器。 一旦過去規定的時間,用戶將會被詢問是否取消或者重啟這個定時器。這個應用程序的完全源代碼可以從項目主頁上找到。

使用Annotations設計一個MVC框架(圖三)
圖3.一個簡單的應用程序

  這個modle是非常簡單的,它只存儲兩個屬性:周期和已經過去的秒數。注重當它其中一個屬性發生變化時它是如何使用java.beans.PropertyChangeSuppor來激發事件。

public class TimeModel {

   public static final int DEFAULT_PERIOD = 60;

   private Timer timer;
   private boolean running;

   private int period;
   private int seconds;

   private PropertyChangeSupport propSupport;

   /**
    * Getters and setters for model properties.
    */

   /**
    * Returns the number of counted seconds.
    *
    * @return the number of counted seconds.
    */
   public int getSeconds() {
      return seconds;
   }

   /**
    * Sets the number of counted seconds. propSupport is an instance of PropertyChangeSupport
    * used to dispatch model state change events.
    *
    * @param seconds the number of counted seconds.
    */
   public void setSeconds(int seconds) {
      propSupport.firePropertyChange("seconds",this.seconds,seconds);
      this.seconds = seconds;
   }

   /**
    * Sets the period that the timer will count. propSupport is an instance of PropertyChangeSupport
    * used to dispatch model state change events.
    *
    * @param period the period that the timer will count.
    */
   public void setPeriod(Integer period){
      propSupport.firePropertyChange("period",this.period,period);
      this.period = period;
   }

   /**
    * Returns the period that the timer will count.
    *
    * @return the period that the timer will count.
    */
   public int getPeriod() {
      return period;
   }

   /**
    * Decides if the timer must restart, depending on the user answer. This method
    * is invoked by the controller once the view has been notified that the timer has
    * counted all the seconds defined in the period.
    *
    * @param answer the user answer.
    */
   public void questionAnswer(boolean answer){
      if (answer) {
         timer = new Timer();
         timer.schedule(new SecondsTask(this),1000,1000);
         running = true;
      }
   }

   /**
    * Starts/stop the timer. This method is invoked by the controller on user input.
    */
   public void setTimer(){
      if (running) {
         timer.cancel();
         timer.purge();
      }
      else {
         setSeconds(0);
         timer = new Timer();
         timer.schedule(new SecondsTask(this),1000,1000);
      }

      running = !running;
   }

   /**
    * The task that counts the seconds.
    */
   private class SecondsTask extends TimerTask {

      /**
       * We're not interested in the implementation so I omit it.
       */

   }
}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕在线| 亚洲精品欧美一区二区三区| 日韩成人黄色av| 国产视频精品va久久久久久| 精品国产999| 欧美另类99xxxxx| 亚洲欧美日本精品| 亚洲一区第一页| 国产精品观看在线亚洲人成网| 成人免费午夜电影| 欧美性少妇18aaaa视频| 久久欧美在线电影| 日韩a**中文字幕| 亚洲最大激情中文字幕| 欧美一区二区三区四区在线| 一区二区三区久久精品| 国产精品免费在线免费| 亚洲伊人一本大道中文字幕| 亚洲色图狂野欧美| 国产亚洲福利一区| 午夜剧场成人观在线视频免费观看| 亚洲福利视频专区| 丁香五六月婷婷久久激情| 精品久久久久久国产91| 91人成网站www| 欧美疯狂做受xxxx高潮| 国产一区二区三区视频免费| 国产视频丨精品|在线观看| 亚洲精品98久久久久久中文字幕| 高清日韩电视剧大全免费播放在线观看| 欧美裸体xxxx极品少妇软件| 在线观看欧美视频| 亚洲视频日韩精品| 欧美俄罗斯乱妇| 亚洲福利视频二区| 欧美成人精品激情在线观看| 亚洲淫片在线视频| 欧美视频中文字幕在线| 久久久成人精品| 欧美激情在线观看| 精品国产精品三级精品av网址| 九九精品视频在线| 自拍偷拍亚洲精品| 国产精品一区av| 欧美性xxxx极品高清hd直播| 欧美第一页在线| 91精品在线国产| 亚洲国产精品一区二区三区| 97婷婷大伊香蕉精品视频| 久久在精品线影院精品国产| 亚洲级视频在线观看免费1级| 久久影院资源网| 黄网站色欧美视频| 91色p视频在线| 国产精品久久中文| 欧美电影电视剧在线观看| 一区二区三区视频在线| 成人福利在线观看| 欧美人在线观看| 色综合伊人色综合网站| 日韩有码在线观看| 欧美男插女视频| 一区二区三区黄色| 中国日韩欧美久久久久久久久| 国产91精品久久久久久| 亚洲欧美制服第一页| 日韩精品欧美国产精品忘忧草| 日韩精品视频中文在线观看| 欧美中文字幕在线观看| 日本精品视频在线观看| 俺也去精品视频在线观看| 色婷婷综合久久久久中文字幕1| 色偷偷偷综合中文字幕;dd| 中文字幕在线看视频国产欧美在线看完整| 色综合久久88色综合天天看泰| 国产精品免费小视频| 久久久免费在线观看| 亚洲国产另类 国产精品国产免费| 亚洲国产精品久久久久秋霞蜜臀| 欧美性xxxx极品高清hd直播| 欧美大片在线影院| 国产精品高潮呻吟久久av黑人| 91九色综合久久| 亚洲午夜国产成人av电影男同| 久久精品久久久久久| 国产成人亚洲综合91| 久久久久久噜噜噜久久久精品| 欧美黑人一级爽快片淫片高清| 亚洲欧美在线第一页| 91精品国产综合久久香蕉922| 国产精品久久综合av爱欲tv| 欧美成人国产va精品日本一级| 亚洲人午夜色婷婷| 在线观看精品国产视频| 中文字幕日韩在线视频| 国产专区精品视频| 成人a级免费视频| 日韩av一区在线| 欧美在线激情网| 最近2019年日本中文免费字幕| 97视频国产在线| 国产98色在线| 日韩av手机在线观看| 欧美激情乱人伦一区| 韩剧1988在线观看免费完整版| 亚洲美女自拍视频| 97视频在线观看视频免费视频| 精品在线观看国产| 欧美激情视频网| 97婷婷大伊香蕉精品视频| 亚洲第一视频网| 亚洲最大成人在线| www.99久久热国产日韩欧美.com| 中文字幕亚洲一区二区三区五十路| 精品亚洲永久免费精品| 国产精品久久久久久久9999| 亚洲色图50p| 91免费精品视频| 久久青草福利网站| 亚洲精品www| 亚洲国产成人精品久久久国产成人一区| 久久99精品久久久久久青青91| 欧美大尺度在线观看| 92看片淫黄大片欧美看国产片| 98精品国产自产在线观看| 国产精品自产拍在线观看| 亚洲国产精品推荐| 亚洲国内精品视频| 一区二区三欧美| 国产精品成人观看视频国产奇米| 最近2019免费中文字幕视频三| 欧美中文字幕第一页| 久久久噜噜噜久久久| 亚洲成人av在线播放| 亚洲四色影视在线观看| 欧美日韩中文字幕在线视频| 亚洲老头老太hd| 韩国一区二区电影| 久久精品国产久精国产一老狼| 午夜精品一区二区三区视频免费看| 亚洲成年人在线播放| 伊人久久综合97精品| 日韩亚洲国产中文字幕| 日韩中文字幕亚洲| 亚洲欧洲免费视频| 亚洲精品美女网站| 国产一区二区丝袜高跟鞋图片| 色综合91久久精品中文字幕| 日韩精品电影网| 欧美日韩国产成人在线| 成人国产精品久久久久久亚洲| 尤物九九久久国产精品的特点| 奇米一区二区三区四区久久| 欧美午夜精品在线| 国产精品一区av| 亚洲天堂第一页| 久久婷婷国产麻豆91天堂| 久久久精品免费| 亚洲成人激情小说| 国产精品video| 亚洲最新av网址| 中文.日本.精品| 激情久久av一区av二区av三区| 国产在线播放91|