2015-07-31 2 views
11

Я иногда показываю диалоговые окна в своем приложении Java.Какой шаблон дизайна можно использовать для отображения диалоговых окон?

В настоящее время классы контроллера (ожидаются некоторые исключения, когда в моей модели вызывается только геттеры), используемые как посредники между моей моделью и моим пользовательским интерфейсом.

Но мой пользовательский интерфейс знает мои контроллеры, и мои контроллеры знают мой интерфейс.

Когда я добавляю новое диалоговое окно, я добавляю метод в контроллер и в класс представления.

Есть ли более элегантный способ расширить мою программу с помощью новых пользовательских диалогов, используя шаблон дизайна?

Чтобы проиллюстрировать, как мое взаимодействие выглядит прямо сейчас, я добавлю некоторые фрагменты кода.

код из моего UI

itmEmailSettings.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      controller.showEmailSettingsDialog(); 
     } 
    }); 

Подробнее UI Код

public void showEmailSettingsDialog(String host, int port, int authMode, 
      String user, String pass, String fromEMail, String fromName) { 
     EmailSettingsDialog d = new EmailSettingsDialog(
       host, port, authMode, 
       user, pass, fromEMail, fromName 
       ); 
     d.createJDialog(mainFrame.getFrame()).setVisible(true); 
     if(d.isValid()){ 
      controller.changeEmailSettings( d.getHost(), d.getPort(), d.getAuthMode(), d.getFromEMail(), d.getFromName(), d.getUser(), d.getPass() ); 
     } 
    } 
код

Контроллер:

public void showEmailSettingsDialog() { 
    try{ 
     if(!pm.hasProjectFileAccess()){ 
      mainFrame.showNoProjectfileAccess(); 
      return; 
     } 
     ProgrammSettingsRepository pr = Utils.getProgrammSettingsRepository(pm); 
     String host = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_HOST); 
     int port = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_PORT)==null?0:Integer.parseInt(pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_PORT)); 
     int authMode = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_SSL_MODE)==null?0:Integer.parseInt(pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_SSL_MODE)); 
     String user = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_USER); 
     String pass = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_PASSWORD); 
     String fromEMail = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_FROM_EMAIL); 
     String fromName = pr.retreive(ProgrammSettingsRepository.KEY_EMAIL_FROM_NAME); 

     menuView.showEmailSettingsDialog(host, port, authMode, user, pass, fromEMail, fromName); 
    }catch(SQLException e){ 
     throw new RuntimeException(e.getMessage(), e); 
    } 
} 

public void changeEmailSettings(String host, int port, int authMode, 
     String fromEMail, String fromName, String user, String pass) { 
    try { 
     ProgrammSettingsRepository pr = Utils.getProgrammSettingsRepository(pm); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_HOST , String.valueOf(host)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_PORT , String.valueOf(port)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_SSL_MODE , String.valueOf(authMode)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_USER , String.valueOf(user)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_PASSWORD, String.valueOf(pass)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_FROM_EMAIL , String.valueOf(fromEMail)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_FROM_NAME , String.valueOf(fromName)); 
     pr.store(ProgrammSettingsRepository.KEY_EMAIL_SETTINGS_CONFIGURED, "true"); 
    } catch (SQLException e) { 
     throw new RuntimeException(e.getMessage(), e); 
    } 
} 
+0

Возможно, я могу использовать метод onIsValid для своих диалогов и метод onIsInvalid. Эти методы получают управляемые файлы от контроллеров. Контроллер отвечает за создание объекта Dialog и его отправку в пользовательский интерфейс. Что отображает диалог и использует обратные вызовы. Но таким образом класс контроллера по-прежнему должен быть изменен для каждого отображаемого диалога, что, я думаю, в порядке. Каждая команда UI приводит к изменению моих классов контроллеров, не так ли? –

+1

Я не уверен, что прямое использование признанного * шаблона проектирования * необходимо для его очистки. – crush

+0

Хороший ООП может выполнить эту работу. –

ответ

3

Я underst и из UI вы вызываете Controller, а затем вы вызываете UI из Controller для отображения диалога. Контроллер выполняет некоторые вычисления, а затем вызывает интерфейс для отображения диалога.

Если вы реализуете IReportable для классов пользовательского интерфейса.

public interface IReportable { 
    public void showYesNoDialog(//all needed params); 
    public void showSimpleDialog(//all needed params); 
      . 
      . 
      . 
} 

public class DialogController() { 
    private IRportable _reportable;//delegator 

    public DialogController(IRportable _reportable) {//bridge pattern. 
     _reportable = reportable; 
    } 

    public void showEmailDialog() { 
     //calculations 
     _reportable.showSimpleDialog(//params); 
    } 

    public void showCustomerDialog() { 
     //calculations 
     _reportable.showYesNoDialog(//params); 
    } 

} 

public class UIClass implements IReportable { 
    private DialogController _dialogController; 

    public UIClass() { 
     _dialogController = new DialogController(); 
    } 

    public void someMethod() { 
     if() { 

     } 
     ... 
     _dialogController.showEmailDialog(); 
    } 

    public void someOtherMethod() { 
     if() { 

     } 
     ... 
     _dialogController.showCustomerDialog(); 
    } 

    @Override 
    public void showYesNoDialog(//all needed params) { 
     //code here to show dialog according to params. 
    } 

    @Override 
    public void showSimpleDialog(//all needed params) { 
     //code here to show dialog according to params. 
    } 

} 

Таким образом, у вас есть зависимость от интерфейса, а не от отдельных компонентов ui. Вы можете изменить интерфейс для абстрактного класса, чтобы иметь одинаковую функциональность для всех классов пользовательского интерфейса ...

+0

В настоящее время я не передаю параметры, а классы, которые создают конкретный диалог для пользовательского интерфейса. Но нет реального преимущества, я полагаю, –

+2

Лучше вывести интерфейсы, чем класс, чтобы создать отдельные плагины для каждого из ваших пакетов и лучше выдать свои интерфейсы и попросить программистов выполнить их. Вы не даете уроки, которые вы даете интерфейсам. – ddarellis

Смежные вопросы