有才華的人,別忘記給滋潤(rùn)你的那塊土壤施肥

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            28 隨筆 :: 5 文章 :: 147 評(píng)論 :: 0 Trackbacks
          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(15)

          我參與的團(tuán)隊(duì)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          記得常去逛逛

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

                用過(guò)Flex的人都知道有個(gè)基于MVCpuremvc框架,這個(gè)框架因?yàn)樾∏珊?jiǎn)單很受歡迎。

          PureMVC框架的目標(biāo)很明確,即把程序分為低耦合的三層:ModelViewController。降低模塊間的耦合性,各模塊如何結(jié)合在一起工作對(duì)于創(chuàng)建易擴(kuò)展,易維護(hù)的應(yīng)用程序是非常重要的。在PureMVC實(shí)現(xiàn)的經(jīng)典MVC元設(shè)計(jì)模式中,這三部分由三個(gè)單例模式類(lèi)管理,分別是ModelViewController。三者合稱(chēng)為核心層或核心角色。PureMVC中還有另外一個(gè)單例模式類(lèi)—FacadeFacade提供了與核心層通信的唯一接口,以簡(jiǎn)化開(kāi)發(fā)復(fù)雜度。

          這里先放這個(gè)PureMVC這張著名的圖:

           

          這里就簡(jiǎn)單介紹了PureMVC一些簡(jiǎn)單知識(shí),詳情可以到puremvc.org 查看。這里我們不大去講他的原理,只是通過(guò)一個(gè)例子來(lái)簡(jiǎn)單說(shuō)下PureMVC的機(jī)制如何來(lái)運(yùn)行一個(gè)Swing項(xiàng)目。

          回到本文重點(diǎn),因?yàn)?/span>PureMVC的小巧簡(jiǎn)單,所以作者也順帶著把他翻譯成了C#ColdFusionHaxeJava JavaScript Objective C PHP Python Ruby,那現(xiàn)在我們就以基于Java來(lái)做個(gè)Demo來(lái)講講PureMVC的運(yùn)行原理。這個(gè)例子是一個(gè)小型系統(tǒng)的簡(jiǎn)單實(shí)現(xiàn),首先彈出一個(gè)對(duì)話框,輸入用戶名和密碼成功后進(jìn)入系統(tǒng),進(jìn)行相關(guān)操作,所有動(dòng)作都是利用PureMvc的機(jī)制發(fā)送消息,做到MVC的三層ModelViewController分離。

          由上圖知道我們,程序的入口是Facade進(jìn)去的,這個(gè)類(lèi)是一個(gè)單類(lèi),一般我們都會(huì)繼承這個(gè)類(lèi)重寫(xiě)Facade,在程序啟動(dòng)的時(shí)候用他我們來(lái)注冊(cè)命令等相關(guān)信息。所有的信息發(fā)送通過(guò)他來(lái)發(fā)送。在使用的時(shí)候我們一般繼承他的initializeController方法用于加載初始化的一些Command,比如點(diǎn)擊菜單打開(kāi)一個(gè)界面的信息,都是在這里預(yù)先注冊(cè),如代碼:

          public class ApplicationFacade extends Facade {
              
              
          private static ApplicationFacade instance= null;
              
              
          protected ApplicationFacade(){
                  
          super();
              }

              
              
          public static ApplicationFacade getInstance(){
                  
          if(instance == null)
                      instance 
          = new ApplicationFacade();
                  
          return instance;
              }

              
              @Override
              
          protected void initializeController() {
                  
          super.initializeController();
                  
          /**
                   * 注冊(cè)初始化的Command
                   * *
          */

                  registerCommand(ApplicationConstants.INITSTAR, InitStartCommand.
          class);
              }

              
          /**
                * 系統(tǒng)初始化完畢后調(diào)用這個(gè)發(fā)送INITSTAR,監(jiān)聽(tīng)這個(gè)命令的Command
                * 就會(huì)加載所有的Command
                * *
          */

              
          public void startup(){
                  sendNotification(ApplicationConstants.INITSTAR, 
          nullnull);
              }

          }

          注冊(cè)完了預(yù)加載的Command的命令后,我們的系統(tǒng)初始化完畢后點(diǎn)擊一個(gè)按鈕需要打開(kāi)一個(gè)頁(yè)面,這個(gè)事件就會(huì)發(fā)送出一個(gè)消息,至于發(fā)給誰(shuí)他不管,這其中如果有注冊(cè)了的Command監(jiān)聽(tīng)了這個(gè)發(fā)送的消息,那么他就會(huì)做進(jìn)一步的操作,如圖所示:

          當(dāng)這個(gè)消息給send出來(lái)后,當(dāng)有Command接受到這個(gè)消息后就會(huì)做他感興趣的事。所有的發(fā)送消息的方法都是通過(guò)sendNotification這個(gè)方法發(fā)送的這個(gè)方法是這樣定義的:

          public void sendNotification(String arg0, Object arg1, String arg2);

          arg0:就是發(fā)送的消息,常量字符串,如上面代碼的INITSTAR一般都會(huì)放在專(zhuān)門(mén)存放常量表中。

          arg1:可以存放任何東西,比如要傳一些值過(guò)去,就可以放在這里面,比如在接下來(lái)的登入成功后就會(huì)把用戶的信息,發(fā)送到主界面中去,就可以這樣定義:

                      Map data = new HashMap();

                     data.put("userName", name);

               facade.sendNotification(ApplicationConstants.LOGIN_SUCESS, data, null);

          arg2:一般可以為空,或其他什么標(biāo)識(shí)等。

          當(dāng)發(fā)送完一個(gè)命令對(duì)應(yīng)的Command監(jiān)聽(tīng)到,他會(huì)在一個(gè)execute方法中做出相應(yīng)的操作如:

          @Override
              
          public void execute(INotification noti) {
                  
          super.execute(noti);
                  
          if(ApplicationConstants.SHOW_FRAME_01.equals(noti.getName())){
                      
          //打開(kāi)InternalFrame01
                      doShow01();
                  }
          else if(ApplicationConstants.SHOW_FRAME_02.equals(noti.getName())){
                      
          //打開(kāi)InternalFrame02
                      doShow02();
                  }
              
              }

              

            當(dāng)偵聽(tīng)到一個(gè)命令比如執(zhí)行doShow01打開(kāi)一個(gè)頁(yè)面,這個(gè)頁(yè)面如果需要和其他頁(yè)面有消息接發(fā)的時(shí)候,那么在這里就主要注冊(cè)一個(gè)Mediator,這個(gè)Mediator要重寫(xiě)兩個(gè)方法,

          public String[] listNotificationInterests( ){    
                  
          return new String[]{
                          ApplicationConstants.LOGIN_SUCESS,
                          ApplicationConstants.CREATE_FRAME,
                          ApplicationConstants.EXIT,
                          ApplicationConstants.SEND_TO_FRAME_01,
                          ApplicationConstants.SEND_TO_FRAME_02
                  }
          ;
              }

            這個(gè)listNotificationInterests方法注冊(cè)我要監(jiān)聽(tīng)什么消息。

             還一個(gè)handleNotification方法如

          public void handleNotification(INotification noti) {
                  
          // TODO Auto-generated method stub
                  super.handleNotification(noti);
                  
          if(ApplicationConstants.LOGIN_SUCESS.equals(noti.getName()))
                      doLoginSucess(noti);
                  }

              }

            這個(gè)handleNotification方法,是執(zhí)行監(jiān)聽(tīng)到那些消息后執(zhí)行具體的動(dòng)作。也就說(shuō)一個(gè)命令發(fā)送會(huì)有CommandMediator都接受到大致這個(gè)框架就是這樣處理的。

          通過(guò)上面的介紹,我們就結(jié)合一個(gè)例子來(lái)簡(jiǎn)單實(shí)現(xiàn)下,這個(gè)例子大意是程序啟動(dòng)后出現(xiàn)一個(gè)登入框,任意輸入用戶名和密碼點(diǎn)擊登入,就會(huì)發(fā)送一個(gè)消息LOGIN_SUCESS,那么這主界面對(duì)應(yīng)的MainFrameMediator監(jiān)聽(tīng)到這消息就會(huì)顯示出程序的主界面,這個(gè)主界面的效果圖為

           

          其中點(diǎn)擊菜單欄的Frame01就會(huì)出現(xiàn)標(biāo)題欄為:Kissjava的一個(gè)JinternalFrame,點(diǎn)擊Frame02會(huì)出現(xiàn)一個(gè)標(biāo)題欄為Rocky JiangJinternalFrame,在標(biāo)題欄為Kissjava頁(yè)面中的輸入框中輸入一些信息點(diǎn)擊發(fā)送一個(gè)SEND_TO_FRAME_02消息,這個(gè)消息會(huì)有對(duì)應(yīng)的標(biāo)題欄為Rocky Jiang的頁(yè)面對(duì)應(yīng)的Mediator和主界面的Mediator監(jiān)聽(tīng)到。所以在各自對(duì)應(yīng)的日志輸入框中都會(huì)出現(xiàn)對(duì)應(yīng)的消息。剛興趣的人可以在后面提供的鏈接下載代碼自己運(yùn)行看看。代碼結(jié)構(gòu)簡(jiǎn)單。

          使用PureMVC機(jī)制,可以很好的實(shí)現(xiàn)MVC三層很好的分離,在本例子中由于例子簡(jiǎn)單就沒(méi)涉及到Model層,這個(gè)Model它只負(fù)責(zé)有數(shù)據(jù)更改的時(shí)候發(fā)送消息,但不會(huì)接受消息,這樣才能做到更好的分離。

          當(dāng)然使用這個(gè)還涉及到一些不用的對(duì)象銷(xiāo)毀等問(wèn)題,這里就不詳說(shuō)了。


          源代碼下載:DOWNLOAD

          posted on 2009-08-20 00:36 kissjava 閱讀(2690) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): swing

          評(píng)論

          # re: 基于pureMVC的Swing程序的入門(mén)介紹 2009-08-21 17:53 99書(shū)城
          不錯(cuò)啊  回復(fù)  更多評(píng)論
            

          # re: 基于pureMVC的Swing程序的入門(mén)介紹 2009-08-25 08:49 找個(gè)美女做老婆
          Java樂(lè)園學(xué)習(xí)網(wǎng)站: http://www.javaly.cn

          有大量的學(xué)習(xí)文章和視頻教程,以及一些項(xiàng)目源碼

          Java樂(lè)園學(xué)習(xí)群: 81107233  回復(fù)  更多評(píng)論
            

          # re: 基于pureMVC的Swing程序的入門(mén)介紹 2009-11-04 06:55 萬(wàn)其
          good  回復(fù)  更多評(píng)論
            

          # re: 基于pureMVC的Swing程序的入門(mén)介紹 2009-11-18 13:09 unidw
          支持!
          能做個(gè)多核版本的Demo嗎?  回復(fù)  更多評(píng)論
            

          # re: 基于pureMVC的Swing程序的入門(mén)介紹 2010-12-28 19:16 JAVA_小白
          作者可不可以再深入些講下 MODEL 的PROXY 怎么操作數(shù)據(jù)庫(kù)的?
          很期待!!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 安化县| 开化县| 东安县| 江川县| 平乐县| 繁昌县| 察雅县| 临城县| 佛冈县| 天祝| 抚州市| 平乡县| 齐齐哈尔市| 福州市| 岳阳市| 武山县| 阳原县| 五大连池市| 浦城县| 壶关县| 定州市| 吴桥县| 阿克陶县| 东乡| 曲麻莱县| 屏山县| 淮安市| 乌兰浩特市| 砀山县| 波密县| 赣州市| 黑河市| 凤冈县| 上虞市| 千阳县| 全南县| 郁南县| 工布江达县| 睢宁县| 谷城县| 南投市|