[JAVA] Entwurfsmuster ~ Verantwortungskette ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Chain of Responsibility-Musters ** im GoF-Entwurfsmuster.

2. Was ist das Muster der Verantwortungskette?

3. Beispielklassendiagramm

ChainofResponsibility.PNG

4. Beispielprogramm

Es ist ein Programm, mit dem einer der Support die von Ihnen eingegebenen Probleme löst.

4-1. Fehlerklasse

Diese Klasse repräsentiert die aufgetretenen Probleme.

Trouble.java


public class Trouble {

	//Störungsnummer
	private int number;

	public Trouble(int number) {
		this.number = number;
	}

	public int getNumber() {
		return number;
	}

	public String toString() {
		return "[Trouble " + number + "]";
	}
}

4-2. Unterstützungsklasse

Eine abstrakte Klasse, die Probleme löst.

Support.java


public abstract class Support {

	//Der Name dieser Fehlerbehebung
	private String name;
	//Drehen Sie die Wanne
	private Support next;

	public Support(String name) {
		this.name = name;
	}

	public Support setNext(Support next) {
		this.next = next;
		return next;
	}

	//Verfahren zur Fehlerbehebung
	public void support(Trouble trouble) {
		if (resolve(trouble)) {
			done(trouble);
		} else if (next != null) {
			next.support(trouble);
		} else {
			fail(trouble);
		}
	}

	public String toString() {
		return "[" + name + "]";
	}

	//Lösungsmethode
	protected abstract boolean resolve(Trouble trouble);

	//Lösung
	protected void done(Trouble trouble) {
		System.out.println(trouble + " is resolved by " + this + ".");
	}

	//ungelöst
	protected void fail(Trouble trouble) {
		System.out.println(trouble + " cannot be resolved.");
	}
}

4-3. NoSupport-Klasse

Dies ist eine konkrete Klasse, die Probleme löst. Wird nicht immer verarbeitet.

NoSupport.java


public class NoSupport extends Support {

	public NoSupport(String name) {
		super(name);
	}

	protected boolean resolve(Trouble trouble) {
		return false;
	}
}

4-4. LimitSupport-Klasse

Dies ist eine konkrete Klasse, die Probleme löst. Sie können Probleme mit Zahlen lösen, die kleiner als die angegebene Zahl sind.

LimitSupport.java


public class LimitSupport extends Support {

	private int limit;

	public LimitSupport(String name, int limit) {
		super(name);
		this.limit = limit;
	}

	//Kann gelöst werden, wenn weniger als das Limit
	protected boolean resolve(Trouble trouble) {
		if (trouble.getNumber() < limit) {
			return true;
		} else {
			return false;
		}
	}
}

4-5. OddSupport-Klasse

Dies ist eine konkrete Klasse, die Probleme löst. Sie können das Problem ungerader Zahlen lösen.

OddSupport.java


public class OddSupport extends Support {

	public OddSupport(String name) {
		super(name);
	}

	//Kann Probleme mit ungeraden Zahlen lösen
	protected boolean resolve(Trouble trouble) {
		if (trouble.getNumber() % 2 == 1) {
			return true;
		} else {
			return false;
		}
	}
}

4-6. SpecialSupport-Klasse

Dies ist eine konkrete Klasse, die Probleme löst. Sie können das Problem einer bestimmten Nummer lösen.

SpecialSupport.java


public class SpecialSupport extends Support {

	private int number;

	public SpecialSupport(String name, int number) {
		super(name);
		this.number = number;
	}

	//Kann gelöst werden, wenn Nummer
	protected boolean resolve(Trouble trouble) {
		if (trouble.getNumber() == number) {
			return true;
		} else {
			return false;
		}
	}
}

4-7 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch.

Main.java


public class Main {
	public static void main(String[] args) {

		Support alice = new NoSupport("Alice");
		Support bob = new LimitSupport("Bob", 100);
		Support charlie = new SpecialSupport("Charlie", 429);
		Support diana = new LimitSupport("Diana", 200);
		Support elmo = new OddSupport("Elmo");

		alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo);

		//Es treten verschiedene Probleme auf
		for (int i = 0; i < 500; i += 33) {
			alice.support(new Trouble(i));
		}
	}
}

4-8 Ausführungsergebnis

[Trouble 0] is resolved by [Diana].
[Trouble 33] is resolved by [Diana].
[Trouble 66] is resolved by [Diana].
[Trouble 99] is resolved by [Diana].
[Trouble 132] is resolved by [Diana].
[Trouble 165] is resolved by [Diana].
[Trouble 198] is resolved by [Diana].
[Trouble 231] is resolved by [Elmo].
[Trouble 264] cannot be resolved.
[Trouble 297] is resolved by [Elmo].
[Trouble 330] cannot be resolved.
[Trouble 363] is resolved by [Elmo].
[Trouble 396] cannot be resolved.
[Trouble 429] is resolved by [Charlie].
[Trouble 462] cannot be resolved.
[Trouble 495] is resolved by [Elmo].

5. Vorteile

Der Punkt des Chain of Responsibility-Musters besteht darin, dass es den "Anforderer (Main)" und den "Anforderer (Support)" ** lose miteinander verbindet. Wenn der "Anforderer (Haupt)" eine Anfrage an die erste Person stellt, fließt die Anfrage durch die Kette und die Anfrage wird von der entsprechenden Person verarbeitet. Ohne das Muster der Verantwortungskette müsste jemand wissen, dass diese Anfrage von dieser Person bearbeitet werden sollte. Wenn dieses Wissen an den "Anforderer (Main)" weitergegeben wird, wird die Unabhängigkeit als Teil beeinträchtigt. Bitte beachten Sie, dass das Muster der ** Verantwortungskette flexibler ist, jedoch aufgrund des Streifens langsamer wird **. Wenn die Verarbeitungsgeschwindigkeit sehr wichtig ist, sollten Sie das Muster der Verantwortungskette nicht verwenden. (Nicht in die Verdienstspalte schreiben! W)

  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 ~ Verantwortungskette ~
Muster der Verantwortungskette
Muster der Verantwortungskette
Überdenken des Java8-Lambda-Ausdrucks- und Stream-Entwurfsmusters - Muster der Verantwortungskette -
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
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
Welchen Mann magst du? Identifizieren von Liebeszielen anhand des Chain of Responsibility-Musters
[Entwurfsmuster] Java-Kernbibliothek
[Java] Zusammenfassung der Entwurfsmuster
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)