Un patron pour préparer un "consultant". Les membres qui effectuent le travail informent le conseiller lorsqu'un événement qui se propage à l'ensemble se produit. De plus, nous répondrons docilement aux instructions du conseiller. Le conseiller prend une décision importante en fonction des nouvelles des membres. Donnez des instructions à chaque membre.
Communiquez avec le rôle de collègue et définissez une interface pour effectuer des ajustements.
package mediator;
public interface Mediator {
//Générer des membres gérés par ce médiateur
public abstract void createColleagues();
//Consultation avec un conseiller
public abstract void collegueChanged();
}
Mettre en place l'interface qui joue le rôle de médiateur et faire les ajustements proprement dits.
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);
//Créer une grille 4x2 à l'aide du gestionnaire de disposition
setLayout(new GridLayout(4, 2));
//Génération de collègues
createColleagues();
//Placement
add(checkGuest);
add(checkLogin);
add(new Label("User name:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
//Efficacité/Paramètre initial non valide
collegueChanged();
//afficher
pack();
show();
}
@Override
public void createColleagues() {
//produire
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(Conseiller)Ensemble de
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
//Ensemble d'auditeurs
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
//Valable pour les notifications d'un collègue/Juge invalide
@Override
public void collegueChanged() {
if (checkGuest.getState()) {
//Mode invité
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setEnabled(true);
} else {
buttonOk.setEnabled(false);
}
} else {
//Mode de connexion
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
//Il y a eu un changement dans textUser ou textPass
//Validité de chaque collège/Juge invalide
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e);
System.exit(0);
}
}
Définissez une interface pour communiquer avec le rôle Médiateur.
package mediator;
public interface Colleague {
public abstract void setMediator(Mediator mediator);
//Correspond à l'instruction provenant du conseiller
public abstract void setColleagueEnabled(boolean enabled);
}
Implémentez l'interface pour le rôle de collègue.
package mediator;
import java.awt.Button;
/**
*LoginFrame classe(Interface du médiateur)Et coopérer avec
*
*/
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;
}
//Valable auprès du médiateur/L'invalidation est ordonnée
@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);
}
//Avertir le médiateur lorsque la chaîne change
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();
}
}
Dans le programme ci-dessus, la classe LoginFrame, qui est un consultant, détermine si le bouton est actif ou inactif. Chaque membre (ColleagueButton, TextField, CheckBox) informe uniquement le conseiller, et la décision est laissée au conseiller.
https://github.com/aki0207/mediator
Je l'ai utilisé comme référence. Édition révisée augmentée Introduction aux modèles de conception appris en langage Java
Recommended Posts