Voici un résumé du ** modèle Mediator ** dans le modèle de conception du GoF.
――Le mot anglais Mediator signifie ** médiateur **, mais il est plus facile à comprendre si vous le considérez réellement comme ** conseiller **. ――Si vous avez 10 membres et que vous vous instruisez mutuellement, le travail sera déroutant. Dans un tel cas, s'il y a un ** conseiller ** dans un poste différent, le membre ne devrait se rapporter qu'au conseiller et le soutien du membre ne devrait être reçu que du conseiller. ――Le modèle Mediator est une méthode qui vous permet de passer à l'action par l'intermédiaire d'un conseiller **.
Un programme qui affiche une boîte de dialogue de connexion et contrôle l'état activé / désactivé du texte et des boutons.
C'est une interface qui sert de consultant.
Mediator.java
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
}
Une classe qui représente une boîte de dialogue de connexion. Implémentez l'interface Mediator.
LoginFrame.java
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);
setLayout(new GridLayout(4, 2));
createColleagues();
add(checkGuest);
add(checkLogin);
add(new Label("Username:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
colleagueChanged();
pack();
setVisible(true);
}
public void createColleagues() {
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");
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
//Chaque collège est valide sur notification du collège/Juger l'invalidité.
public void colleagueChanged() {
if (checkGuest.getState()) {
// Guest mode
textUser.setColleagueEnabled(false);
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(true);
} else {
// Login mode
textUser.setColleagueEnabled(true);
userpassChanged();
}
}
private void userpassChanged() {
if (textUser.getText().length() > 0) {
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setColleagueEnabled(true);
} else {
buttonOk.setColleagueEnabled(false);
}
} else {
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
}
C'est une interface pour devenir membre.
Colleague.java
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
Une classe qui représente un bouton. Implémente l'interface Colleague.
ColleagueButton.java
import java.awt.Button;
public class ColleagueButton extends Button implements Colleague {
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {
//Valable auprès du médiateur/L'invalidation est ordonnée
setEnabled(enabled);
}
}
Une classe qui représente une case à cocher (ici un bouton radio). Implémente l'interface Colleague.
ColleagueCheckbox.java
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);
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {
//Valable auprès du médiateur/L'invalidation est ordonnée
setEnabled(enabled);
}
public void itemStateChanged(ItemEvent e) {
//Avertir le médiateur lorsque le statut change
mediator.colleagueChanged();
}
}
Une classe qui représente une zone de texte. Implémente l'interface Colleague.
ColleagueTextField.java
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);
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {
//Valable auprès du médiateur/L'invalidation est ordonnée
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
public void textValueChanged(TextEvent e) {
//Avertir le médiateur lorsque la chaîne change
mediator.colleagueChanged();
}
}
Cette classe effectue le traitement principal.
Main.java
public class Main {
static public void main(String args[]) {
new LoginFrame("Mediator Sample");
}
}
La logique d'activation / désactivation de l'affichage est compliquée, mais elle est médiée par la classe LoginFrame. Si vous modifiez les spécifications d'affichage ou trouvez un bogue, il vous suffit de corriger et de déboguer la classe LoginFrame. Une fois que la logique est distribuée sur CollegeButton, CollegeCheckbox et CollegeTextField, il est difficile d'écrire, de déboguer et de modifier.
Cet article et l'exemple de programme ont été créés à partir des livres suivants.
C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.
Recommended Posts