Подтвердить что ты не робот

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

Я иногда показываю диалоговые окна в своем приложении Java.

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

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

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

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

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

Код из моего пользовательского интерфейса

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

Больше кода пользовательского интерфейса

    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);
    }
}
4b9b3361

Ответ 1

Я понимаю, что из 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. Вы можете изменить интерфейс для абстрактного класса, чтобы он имел одинаковые функциональные возможности для всех классов пользовательского интерфейса...