[JAVA] Entwurfsmuster ~ Mediator ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Mediator-Musters ** im GoF-Entwurfsmuster.

2. Was ist das Mediator-Muster?

――Das englische Wort Mediator bedeutet ** Mediator **, aber es ist leichter zu verstehen, wenn Sie es tatsächlich als ** Berater ** betrachten. ――Wenn Sie 10 Mitglieder haben und sich gegenseitig unterweisen, ist die Arbeit verwirrend. In einem solchen Fall sollte sich das Mitglied nur dem Berater melden, wenn sich ein ** Berater ** in einer anderen Position befindet, und die Unterstützung für das Mitglied sollte nur vom Berater erhalten werden. ――Das Mediator-Muster ist eine Methode, mit der Sie durch einen Berater Maßnahmen ergreifen können **.

3. Beispielklassendiagramm

Mediator.PNG

4. Beispielprogramm

Ein Programm, das einen Anmeldedialog anzeigt und den aktivierten / deaktivierten Status von Text und Schaltflächen steuert.

4-1. Mediator-Schnittstelle

Es ist eine Schnittstelle, die als Berater dient.

Mediator.java


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

4-2. LoginFrame-Klasse

Eine Klasse, die einen Anmeldedialog darstellt. Implementieren Sie die Mediator-Schnittstelle.

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

	//Jedes College ist durch Benachrichtigung des Colleges gültig/Invalidität beurteilen.
	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. Kollegenschnittstelle

Es ist eine Schnittstelle, um Mitglied zu werden.

Colleague.java


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

4-4. ColleagueButton-Klasse

Eine Klasse, die eine Schaltfläche darstellt. Implementiert die Colleague-Oberfläche.

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) {
		//Gültig ab Mediator/Die Invalidierung wird angewiesen
		setEnabled(enabled);
	}
}

4-5. ColleagueCheckbox-Klasse

Eine Klasse, die ein Kontrollkästchen darstellt (hier ein Optionsfeld). Implementiert die Colleague-Oberfläche.

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) {
		//Gültig ab Mediator/Die Invalidierung wird angewiesen
		setEnabled(enabled);
	}

	public void itemStateChanged(ItemEvent e) {
		//Benachrichtigen Sie den Mediator, wenn sich der Status ändert
		mediator.colleagueChanged();
	}
}

4-6. ColleagueTextField-Klasse

Eine Klasse, die ein Textfeld darstellt. Implementiert die Colleague-Oberfläche.

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) {
		//Gültig ab Mediator/Die Invalidierung wird angewiesen
		setEnabled(enabled);
		setBackground(enabled ? Color.white : Color.lightGray);
	}

	public void textValueChanged(TextEvent e) {
		//Benachrichtigen Sie Mediator, wenn sich die Zeichenfolge ändert
		mediator.colleagueChanged();
	}
}

4-7 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch.

Main.java


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

4-8 Ausführungsergebnis

f.PNG

5. Vorteile

Die Logik zum Aktivieren / Deaktivieren der Anzeige ist kompliziert, wird jedoch von der LoginFrame-Klasse vermittelt. Wenn Sie die Anzeigespezifikationen ändern oder einen Fehler finden, müssen Sie nur die LoginFrame-Klasse reparieren und debuggen. Sobald die Logik auf CollegeButton, CollegeCheckbox und CollegeTextField verteilt ist, ist es schwierig, sie zu schreiben, zu debuggen und zu ändern.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.

Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen der Entwurfsmuster und Beispielprogramme sind geschrieben. Schauen Sie sich also auch die Bücher an.

Recommended Posts

Entwurfsmuster ~ Mediator ~
Vermittlermuster
Vermittlermuster
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Erinnerungsmuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Fassadenmuster
Besuchermuster
Brückenmuster
PrintObserver "Observer Design Pattern: Beschreibung und Implementierungsbeispiel"
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -