Я иногда показываю диалоговые окна в своем приложении 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);
}
}
Возможно, я могу использовать метод onIsValid для своих диалогов и метод onIsInvalid. Эти методы получают управляемые файлы от контроллеров. Контроллер отвечает за создание объекта Dialog и его отправку в пользовательский интерфейс. Что отображает диалог и использует обратные вызовы. Но таким образом класс контроллера по-прежнему должен быть изменен для каждого отображаемого диалога, что, я думаю, в порядке. Каждая команда UI приводит к изменению моих классов контроллеров, не так ли? –
Я не уверен, что прямое использование признанного * шаблона проектирования * необходимо для его очистки. – crush
Хороший ООП может выполнить эту работу. –