Ein Muster zur Vorbereitung eines "Beraters". Die Mitglieder, die die Arbeit ausführen, informieren den Berater, wenn ein Ereignis eintritt, das sich auf das Ganze ausbreitet. Darüber hinaus werden wir gehorsam auf Anweisungen des Beraters reagieren. Der Berater trifft eine große Entscheidung auf der Grundlage der Nachrichten der Mitglieder. Geben Sie jedem Mitglied Anweisungen.
Kommunizieren Sie mit der Rolle des Kollegen und definieren Sie eine Schnittstelle für Anpassungen.
package mediator;
public interface Mediator {
//Generieren Sie Mitglieder, die von diesem Mediator verwaltet werden
public abstract void createColleagues();
//Beratung mit einem Berater
public abstract void collegueChanged();
}
Implementieren Sie die Schnittstelle, die die Rolle des Mediators spielt, und nehmen Sie die tatsächlichen Anpassungen vor.
package mediator;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends Frame implements ActionListener, Mediator {
private ColleagueCheckBox checkGuest;
private ColleagueCheckBox checkLogin;
private ColleagueTextField textUser;
private ColleagueTextField textPass;
private ColleagueButton buttonOk;
private ColleagueButton buttonCancel;
public LoginFrame(String title) {
super(title);
setBackground(Color.lightGray);
//Erstellen Sie mit Layout Manager ein 4x2-Raster
setLayout(new GridLayout(4, 2));
//Generierung von Kollegen
createColleagues();
//Platzierung
add(checkGuest);
add(checkLogin);
add(new Label("User name:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
//Wirksamkeit/Ungültige Grundeinstellung
collegueChanged();
//Anzeige
pack();
show();
}
@Override
public void createColleagues() {
//Generieren
CheckboxGroup g = new CheckboxGroup();
checkGuest = new ColleagueCheckBox("Guest", g, true);
checkLogin = new ColleagueCheckBox("Login", g, false);
textUser = new ColleagueTextField("", 10);
textPass = new ColleagueTextField("", 10);
textPass.setEchoChar('*');
buttonOk = new ColleagueButton("OK");
buttonCancel = new ColleagueButton("Cancel");
// Mediator(Berater)Satz von
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
//Satz von Zuhörern
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
//Gültig für Benachrichtigungen von Kollegen/Richter ungültig
@Override
public void collegueChanged() {
if (checkGuest.getState()) {
//Gastmodus
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setEnabled(true);
} else {
buttonOk.setEnabled(false);
}
} else {
//Anmeldemodus
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
//TextUser oder textPass wurden geändert
//Gültigkeit jedes Kollegiums/Richter ungültig
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
System.exit(0);
}
}
Definieren Sie eine Schnittstelle für die Kommunikation mit der Mediator-Rolle.
package mediator;
public interface Colleague {
public abstract void setMediator(Mediator mediator);
//Entspricht der Anweisung des Beraters
public abstract void setColleagueEnabled(boolean enabled);
}
Implementieren Sie die Schnittstelle für die Rolle des Kollegen.
package mediator;
import java.awt.Button;
/**
*LoginFrame-Klasse(Mediator-Schnittstelle)Und kooperieren mit
*
*/
public class ColleagueButton extends Button implements Colleague{
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
//Gültig ab Mediator/Die Invalidierung wird angewiesen
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
package mediator;
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
public class ColleagueTextField extends TextField implements TextListener, Colleague {
private Mediator mediator;
public ColleagueTextField(String text, int columns) {
super(text, columns);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
//Benachrichtigen Sie Mediator, wenn sich die Zeichenfolge ändert
public void textValueChanged(TextEvent e) {
mediator.collegueChanged();
}
}
package mediator;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ColleagueCheckBox extends Checkbox implements ItemListener, Colleague {
private Mediator mediator;
public ColleagueCheckBox(String caption, CheckboxGroup group, boolean state) {
super(caption, group, state);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
@Override
public void itemStateChanged(ItemEvent e) {
mediator.collegueChanged();
}
}
Im obigen Programm bestimmt die LoginFrame-Klasse, bei der es sich um einen Berater handelt, ob die Schaltfläche aktiv oder inaktiv ist. Jedes Mitglied (ColleagueButton, TextField, CheckBox) informiert nur den Berater, und die Entscheidung bleibt dem Berater überlassen.
https://github.com/aki0207/mediator
Ich habe dies als Referenz verwendet. Augmented Revised Edition Einführung in in Java gelernte Entwurfsmuster
Recommended Posts