<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    有才華的人,別忘記給滋潤你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks
          用過Flex的人都知道有個基于MVCpuremvc框架,這個框架因為小巧簡單很受歡迎。

    PureMVC框架的目標很明確,即把程序分為低耦合的三層:ModelViewController。降低模塊間的耦合性,各模塊如何結合在一起工作對于創建易擴展,易維護的應用程序是非常重要的。在PureMVC實現的經典MVC元設計模式中,這三部分由三個單例模式類管理,分別是ModelViewController。三者合稱為核心層或核心角色。PureMVC中還有另外一個單例模式類—FacadeFacade提供了與核心層通信的唯一接口,以簡化開發復雜度。

    這里先放這個PureMVC這張著名的圖:

     

    這里就簡單介紹了PureMVC一些簡單知識,詳情可以到puremvc.org 查看。這里我們不大去講他的原理,只是通過一個例子來簡單說下PureMVC的機制如何來運行一個Swing項目。

    回到本文重點,因為PureMVC的小巧簡單,所以作者也順帶著把他翻譯成了C#ColdFusionHaxeJava JavaScript Objective C PHP Python Ruby,那現在我們就以基于Java來做個Demo來講講PureMVC的運行原理。這個例子是一個小型系統的簡單實現,首先彈出一個對話框,輸入用戶名和密碼成功后進入系統,進行相關操作,所有動作都是利用PureMvc的機制發送消息,做到MVC的三層ModelViewController分離。

    由上圖知道我們,程序的入口是Facade進去的,這個類是一個單類,一般我們都會繼承這個類重寫Facade,在程序啟動的時候用他我們來注冊命令等相關信息。所有的信息發送通過他來發送。在使用的時候我們一般繼承他的initializeController方法用于加載初始化的一些Command,比如點擊菜單打開一個界面的信息,都是在這里預先注冊,如代碼:

    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();
            
    /**
             * 注冊初始化的Command
             * *
    */

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

        
    /**
          * 系統初始化完畢后調用這個發送INITSTAR,監聽這個命令的Command
          * 就會加載所有的Command
          * *
    */

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

    }

    注冊完了預加載的Command的命令后,我們的系統初始化完畢后點擊一個按鈕需要打開一個頁面,這個事件就會發送出一個消息,至于發給誰他不管,這其中如果有注冊了的Command監聽了這個發送的消息,那么他就會做進一步的操作,如圖所示:

    當這個消息給send出來后,當有Command接受到這個消息后就會做他感興趣的事。所有的發送消息的方法都是通過sendNotification這個方法發送的這個方法是這樣定義的:

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

    arg0:就是發送的消息,常量字符串,如上面代碼的INITSTAR一般都會放在專門存放常量表中。

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

                Map data = new HashMap();

               data.put("userName", name);

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

    arg2:一般可以為空,或其他什么標識等。

    當發送完一個命令對應的Command監聽到,他會在一個execute方法中做出相應的操作如:

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

        

      當偵聽到一個命令比如執行doShow01打開一個頁面,這個頁面如果需要和其他頁面有消息接發的時候,那么在這里就主要注冊一個Mediator,這個Mediator要重寫兩個方法,

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

      這個listNotificationInterests方法注冊我要監聽什么消息。

       還一個handleNotification方法如

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

        }

      這個handleNotification方法,是執行監聽到那些消息后執行具體的動作。也就說一個命令發送會有CommandMediator都接受到大致這個框架就是這樣處理的。

    通過上面的介紹,我們就結合一個例子來簡單實現下,這個例子大意是程序啟動后出現一個登入框,任意輸入用戶名和密碼點擊登入,就會發送一個消息LOGIN_SUCESS,那么這主界面對應的MainFrameMediator監聽到這消息就會顯示出程序的主界面,這個主界面的效果圖為

     

    其中點擊菜單欄的Frame01就會出現標題欄為:Kissjava的一個JinternalFrame,點擊Frame02會出現一個標題欄為Rocky JiangJinternalFrame,在標題欄為Kissjava頁面中的輸入框中輸入一些信息點擊發送一個SEND_TO_FRAME_02消息,這個消息會有對應的標題欄為Rocky Jiang的頁面對應的Mediator和主界面的Mediator監聽到。所以在各自對應的日志輸入框中都會出現對應的消息。剛興趣的人可以在后面提供的鏈接下載代碼自己運行看看。代碼結構簡單。

    使用PureMVC機制,可以很好的實現MVC三層很好的分離,在本例子中由于例子簡單就沒涉及到Model層,這個Model它只負責有數據更改的時候發送消息,但不會接受消息,這樣才能做到更好的分離。

    當然使用這個還涉及到一些不用的對象銷毀等問題,這里就不詳說了。


    源代碼下載:DOWNLOAD

    posted on 2009-08-20 00:36 kissjava 閱讀(2686) 評論(5)  編輯  收藏 所屬分類: swing

    評論

    # re: 基于pureMVC的Swing程序的入門介紹 2009-08-21 17:53 99書城
    不錯啊  回復  更多評論
      

    # re: 基于pureMVC的Swing程序的入門介紹 2009-08-25 08:49 找個美女做老婆
    Java樂園學習網站: http://www.javaly.cn

    有大量的學習文章和視頻教程,以及一些項目源碼

    Java樂園學習群: 81107233  回復  更多評論
      

    # re: 基于pureMVC的Swing程序的入門介紹 2009-11-04 06:55 萬其
    good  回復  更多評論
      

    # re: 基于pureMVC的Swing程序的入門介紹 2009-11-18 13:09 unidw
    支持!
    能做個多核版本的Demo嗎?  回復  更多評論
      

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

    主站蜘蛛池模板: 亚洲中文无码亚洲人成影院| 青娱分类视频精品免费2| 亚洲中文字幕AV每天更新| 亚洲av无码av制服另类专区| 免费在线观看毛片| 亚洲三级电影网址| 国产国产人免费视频成69堂| 亚洲熟妇久久精品| 精品亚洲成a人片在线观看| 国产亚洲精品无码专区| 最近2019中文字幕免费大全5| 精品乱子伦一区二区三区高清免费播放 | 在线a亚洲v天堂网2018| 久久精品成人免费国产片小草| 精品韩国亚洲av无码不卡区| 中文字幕精品无码亚洲字 | 亚洲人成电影网站| 国产精品免费视频网站| 永久免费av无码网站韩国毛片 | 日韩人妻无码免费视频一区二区三区 | 暖暖免费高清日本中文| 毛片免费vip会员在线看| 足恋玩丝袜脚视频免费网站| 久章草在线精品视频免费观看| 亚洲日韩中文字幕一区| 亚洲成人免费电影| 亚洲视频免费观看| 91亚洲视频在线观看| 亚洲日本在线播放| 亚洲人成网站在线观看播放青青| 亚洲国产中文在线视频| 亚洲人成人77777在线播放| 亚洲国产av美女网站| 亚洲人成小说网站色| 亚洲乱码日产精品一二三| 亚洲大尺度无码无码专线一区| 亚洲VA中文字幕无码毛片| 亚洲av永久无码精品网站| 亚洲日本在线看片| 亚洲一级黄色大片| 亚洲AV永久青草无码精品|