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