2017-06-26 159 views
2

我正在開發一個帶有RMI的電子郵件客戶機/服務器Java應用程序。我設計了基於MVC架構的客戶端。特別是,我將Controller註冊爲View事件偵聽器,例如,如果按下View的「收件箱」按鈕,Controller可以通過服務器本身的存根從服務器下載傳入的電子郵件。Java MVC體系結構

所有這一切的結果是,控制器充滿了按下按鈕名稱的條件代碼塊,這非常糟糕。任何人都可以推薦我一種替代條件塊的方法嗎?我想過使用一些設計模式,但在這種情況下,我不知道哪個是最好的。

謝謝!

+0

註冊N個聽衆,每個按鈕一個。 –

+0

如何?例如,假設我們在視圖中有這樣的內容: btn1.addActionListener(controller); btn2.addActionListener(controller); btn3.addActionListener(controller); 但是,Controller類只能實現一個actionPerformed方法。 – Cilla

+1

如果您發佈了代碼而不是描述它,它會更容易幫助 –

回答

2

,而不是編寫if/else語句

public class Controller implements ActionListener { 

    public void actionPerformed(ActionEvent ae){ 
     if(....) { 
      // action1 
     } else if(...){ 
      // action2  
     } 
    } 
} 

把每一個分支在自己的方法。例如。現在

public class Controller { 

    public void action1(){ 
     // .... 
    } 

    public void action2(ActionEvent ae){ 
     // .... 
    } 
} 

你可以使用匿名ActionListener委託給合適的方法。例如。

btn1.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent ae){ 
     controller.action1(); 
    } 
}); 

btn2.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent ae){ 
     controller.action2(ae); 
    } 
}); 

在Java 8中,您可以使用方法引用或lambda表達式。

Controller controller = new Controller(); 

btn1.addActionListener(controller::action1); 
btn2.addActionListener(ae -> controller.action2()); 
+0

超級簡單幹淨!非常感謝! – Cilla

1

讓我們想象一下,你有你的視圖按鈕,讓他們成爲「發送」和「關閉」 我認爲這是最好有兩個方法控制器的內部,像controller.onCloseClicked()controller.onSendClicked()您可以使用兩種選擇。這種方式:

  1. 實現一個監聽器並添加條件代碼塊來決定 控制器觸發什麼方法。
  2. 實現按鈕的監聽器很少,每個按鈕一個,並直接從它們觸發控制器的具體方法。

爲什麼它更好?有時你不僅需要發送事件,而且需要從ui(視圖)向控制器發送一些數據。如果每個動作有一個方法,則更容易處理。