我正在開發一個帶有RMI的電子郵件客戶機/服務器Java應用程序。我設計了基於MVC架構的客戶端。特別是,我將Controller註冊爲View事件偵聽器,例如,如果按下View的「收件箱」按鈕,Controller可以通過服務器本身的存根從服務器下載傳入的電子郵件。Java MVC體系結構
所有這一切的結果是,控制器充滿了按下按鈕名稱的條件代碼塊,這非常糟糕。任何人都可以推薦我一種替代條件塊的方法嗎?我想過使用一些設計模式,但在這種情況下,我不知道哪個是最好的。
謝謝!
我正在開發一個帶有RMI的電子郵件客戶機/服務器Java應用程序。我設計了基於MVC架構的客戶端。特別是,我將Controller註冊爲View事件偵聽器,例如,如果按下View的「收件箱」按鈕,Controller可以通過服務器本身的存根從服務器下載傳入的電子郵件。Java MVC體系結構
所有這一切的結果是,控制器充滿了按下按鈕名稱的條件代碼塊,這非常糟糕。任何人都可以推薦我一種替代條件塊的方法嗎?我想過使用一些設計模式,但在這種情況下,我不知道哪個是最好的。
謝謝!
,而不是編寫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());
超級簡單幹淨!非常感謝! – Cilla
讓我們想象一下,你有你的視圖按鈕,讓他們成爲「發送」和「關閉」 我認爲這是最好有兩個方法控制器的內部,像controller.onCloseClicked()
和controller.onSendClicked()
您可以使用兩種選擇。這種方式:
爲什麼它更好?有時你不僅需要發送事件,而且需要從ui(視圖)向控制器發送一些數據。如果每個動作有一個方法,則更容易處理。
註冊N個聽衆,每個按鈕一個。 –
如何?例如,假設我們在視圖中有這樣的內容: btn1.addActionListener(controller); btn2.addActionListener(controller); btn3.addActionListener(controller); 但是,Controller類只能實現一個actionPerformed方法。 – Cilla
如果您發佈了代碼而不是描述它,它會更容易幫助 –