Ich zeige manchmal Dialogfelder in meiner Java-Anwendung.Welches Entwurfsmuster könnte ich zum Anzeigen von Dialogfeldern verwenden?
Derzeit werden die Controller-Klassen (erwarten einige Ausnahmen, bei denen nur Getter auf meinem Modell aufgerufen werden) als Mediatoren zwischen meinem Modell und meiner UI verwendet.
Aber meine Benutzeroberfläche kennt meine Controller und meine Controller kennen meine Benutzeroberfläche.
Immer, wenn ich einen neuen Dialog hinzufüge, füge ich eine Methode in einem Controller und in der View-Klasse hinzu.
Gibt es eine elegantere Möglichkeit, mein Programm mit neuen Benutzerdialogen zu erweitern, indem ein Designmuster verwendet wird?
Um Ihnen zu zeigen, wie meine Interaktion jetzt aussieht, werde ich einige Code-Schnipsel anhängen.
-Code von meinem UI
itmEmailSettings.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
controller.showEmailSettingsDialog();
}
});
Weitere UI-Code
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() );
}
}
Controller-Code:
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);
}
}
Vielleicht kann ich eine OnIsValid-Methode für meine Dialoge und eine OnIsInvalid-Methode verwenden. Diese Methoden erhalten Runnables von den Controllern. Der Controller ist dafür verantwortlich, das Dialog-Objekt zu erstellen und es an die Benutzerschnittstelle zu senden. Welche den Dialog anzeigt und die Rückrufe verwendet. Aber auf diese Weise muss die Controller-Klasse noch für jeden anzuzeigenden Dialog geändert werden, was ich für okay halte. Jeder UI-Befehl führt zu einer Änderung meiner Controller-Klassen, nicht wahr? –
Ich bin mir nicht sicher, ob direkt ein anerkanntes * Designmuster * verwendet werden muss, um dies zu bereinigen. – crush
Gute OOP könnte auch den Job erledigen. –