[JAVA] Entwurfsmuster ~ Dekorateur ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Dekorationsmusters ** im GoF-Entwurfsmuster.

2. Wie ist das Dekorationsmuster?

3. Beispielklassendiagramm

Decorator.PNG

4. Beispielprogramm

Dies ist ein Programm, das die eingegebene Zeichenfolge mit einem Rahmen verziert.

4-1. Anzeigeklasse

Eine abstrakte Klasse zum Anzeigen von Zeichenfolgen.

Display.java


public abstract class Display {

	//Ermitteln Sie die Anzahl der horizontalen Zeichen
	public abstract int getColumns();
	//Ermitteln Sie die Anzahl der vertikalen Zeilen
	public abstract int getRows();
	//Holen Sie sich die Zeichenfolge in die angegebene Zeile
	public abstract String getRowText(int row);

	public void show() {
		for (int i = 0; i < getRows(); i++) {
			System.out.println(getRowText(i));
		}
	}
}

4-2. StringDisplay-Klasse

Diese Klasse dient zum Anzeigen einer Zeichenfolge, die nur aus einer Zeile besteht.

StringDisplay.java


public class StringDisplay extends Display {

	private String string;

	public StringDisplay(String string) {
		this.string = string;
	}

	public int getColumns() {

		return string.getBytes().length;
	}

	public int getRows() {
		return 1;
	}

	public String getRowText(int row) {
		return (row == 0) ? string : null;
	}
}

4-3 Grenzklasse

Eine abstrakte Klasse, die einen dekorativen Rahmen darstellt.

Border.java


public abstract class Border extends Display {

	protected Display display;

	protected Border(Display display) {
		this.display = display;
	}
}

4-4. SideBorder-Klasse

Diese Klasse hat links und rechts dekorative Rahmen.

SideBorder.java


public class SideBorder extends Border {

	public SideBorder(Display display) {
		super(display);
	}

	public int getColumns() {
		//Die Anzahl der Zeichen ist die Anzahl der dekorativen Zeichen, die zu beiden Seiten des Inhalts hinzugefügt werden
		return 1 + display.getColumns() + 1;
	}

	public int getRows() {
		//Die Anzahl der Zeilen entspricht der Anzahl der Zeilen im Inhalt
		return display.getRows();
	}

	public String getRowText(int row) {
		return "*" + display.getRowText(row) + "*";
	}
}

4-5. FullBorder-Klasse

Diese Klasse hat oben, unten, links und rechts dekorative Rahmen.

FullBorder.java


public class FullBorder extends Border {

	public FullBorder(Display display) {
		super(display);
	}

	public int getColumns() {
		//Die Anzahl der Zeichen ist die Anzahl einschließlich der linken und rechten dekorativen Zeichen auf beiden Seiten des Inhalts
		return 1 + display.getColumns() + 1;
	}

	public int getRows() {
		//Die Anzahl der Zeilen ist die Anzahl der Zeilen im Inneren sowie die oberen und unteren dekorativen Zeichen
		return 1 + display.getRows() + 1;
	}

	public String getRowText(int row) {
		if (row == 0) {
			//Oberer Rahmen
			return "+" + makeLine('-', display.getColumns()) + "+";
		} else if (row == display.getRows() + 1) {
			//Unterer Rahmen
			return "+" + makeLine('-', display.getColumns()) + "+";
		} else {
			//anders als das
			return "|" + display.getRowText(row - 1) + "|";
		}
	}

	private String makeLine(char ch, int count) {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < count; i++) {
			buf.append(ch);
		}
		return buf.toString();
	}
}

4-6 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch.

Main.java


public class Main {

	public static void main(String[] args) {
		Display b1 = new StringDisplay("Hello world");
		b1.show();
		System.out.println("");

		Display b2 = new SideBorder(b1);
		b2.show();
		System.out.println("");

		Display b3 = new FullBorder(b2);
		b3.show();
		System.out.println("");

		Display b4 =
			new FullBorder(
				new SideBorder(
					new FullBorder(
						new StringDisplay("Hello japan"))));
		b4.show();
	}
}

4-7 Ausführungsergebnis

Hello world

*Hello world*

+-------------+
|*Hello world*|
+-------------+

+---------------+
|*+-----------+*|
|*|Hello japan|*|
|*+-----------+*|
+---------------+

5. Vorteile

Im Decorator-Muster haben sowohl der Rand als auch der Inhalt (String-Anzeige) eine gemeinsame Schnittstelle. Die Benutzeroberfläche ist dieselbe, aber je mehr Sie sie einschließen, desto mehr Funktionen fügen Sie hinzu. Zu diesem Zeitpunkt ist es nicht erforderlich, die eingewickelte Person zu ändern. Sie können Funktionen hinzufügen, ohne die Verpackung 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 ~ Dekorateur ~
Dekorationsmuster
Dekorateur Muster
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
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
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Fliegengewichtsmuster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster
PrintObserver "Observer Design Pattern: Beschreibung und Implementierungsbeispiel"
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -