[JAVA] Modèle de conception ~ Médiateur ~

1.Tout d'abord

Voici un résumé du ** modèle Mediator ** dans le modèle de conception du GoF.

2. Quel est le modèle Mediator?

――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 **.

3. Exemple de diagramme de classes

Mediator.PNG

4. Exemple de programme

Un programme qui affiche une boîte de dialogue de connexion et contrôle l'état activé / désactivé du texte et des boutons.

4-1. Interface du médiateur

C'est une interface qui sert de consultant.

Mediator.java


public interface Mediator {
	public abstract void createColleagues();
	public abstract void colleagueChanged();
}

4-2. Classe LoginFrame

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);
	}
}

4-3. Interface des collègues

C'est une interface pour devenir membre.

Colleague.java


public interface Colleague {
	public abstract void setMediator(Mediator mediator);
	public abstract void setColleagueEnabled(boolean enabled);
}

4-4. Classe ColleagueButton

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);
	}
}

4-5. Classe ColleagueCheckbox

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();
	}
}

4-6. Classe ColleagueTextField

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();
	}
}

4-7. Classe principale

Cette classe effectue le traitement principal.

Main.java


public class Main {
	static public void main(String args[]) {
		new LoginFrame("Mediator Sample");
	}
}

4-8. Résultat de l'exécution

f.PNG

5. Avantages

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.

  1. GitHub

7. Liste des modèles de conception

8. Référence

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

Modèle de conception ~ Médiateur ~
Motif médiateur
Modèle de médiateur
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Composite ~
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de prototype
Motif de souvenir
Modèle d'itérateur
Motif composite
Modèle d'observateur
Modèle de constructeur
Modèle de pont
Modèle de commande
Modèle de constructeur
Modèle de stratégie
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Modèle de façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Motif de façade
Modèle de visiteur
Modèle de pont
PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -