程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於pureMVC的Swing程序的入門介紹

基於pureMVC的Swing程序的入門介紹

編輯:關於JAVA

用過Flex的人都知道有個基於MVC的puremvc框架,這個框架因為小巧簡單很受歡迎。

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

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

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

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

由上圖知道我們,程序的入口是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, null, null);
    }
}

注冊完了預加載的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方法,是執行監聽到那些消息後執行具體的動作。也就說一個命令發送會有Command和Mediator都接受到。大致這個框架就是這樣處理的。

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved