[JAVA] Dekorationsmuster

Was ist das Derocator-Muster?

Dekoriere das Objekt.

Die Rolle der Komponente

Die Kernrolle beim Hinzufügen von Funktionen.

package decorator;

public abstract class Display {
	public abstract int getColumns();
	public abstract int getRows();
	public abstract String getRowText(int row);
	public final void show() {
		for (int i = 0; i < getRows(); i++) {
			System.out.println(getRowText(i));
		}
	}
}

Die Rolle der Betonkomponente

Eine Rolle, die die Schnittstelle der Komponentenrolle implementiert.

package decorator;

/**
 *Eine Klasse, die eine einzelne Textzeile anzeigt
 */
public class StringDisplay extends Display{
	private String string;

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

	@Override
	public int getColumns() {
		return string.getBytes().length;
	}

	@Override
	public int getRows() {
		return 1;
	}

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

Die Rolle des Dekorateurs

Hat die gleiche Schnittstelle wie die Komponentenrolle. Darüber hinaus verfügt es über eine Komponentenrolle, die das Ziel der Decorator-Rolle ist. Diese Rolle weiß, was er dekorieren will.

package decorator;

/**
 *Klasse, die einen dekorativen Rahmen darstellt
 */
public abstract class Border extends Display {
	//Bezieht sich auf den "Inhalt", in den dieser dekorative Rahmen eingewickelt ist
	protected Display display;
	protected Border(Display display) {
		this.display = display;
	}
}

Die Rolle des Betondekorateurs

Die Rolle eines Betondekorateurs.

package decorator;

/**
 *Eine Klasse, die die linke und rechte Seite einer Zeichenkette mit festen Zeichen verziert
 *
 */
public class SideBorder extends Border {
	private char borderChar;

	protected SideBorder(Display display, char ch) {
		super(display);
		this.borderChar = ch;
	}

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

	@Override
	public int getRows() {
		return display.getRows();
	}

	@Override
	public String getRowText(int row) {
		return borderChar + display.getRowText(row) + borderChar;
	}
}
package decorator;

/**
 *Klasse zum Dekorieren nach oben, unten, links und rechts
 *
 */
public class FullBorder extends Border{

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

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

	@Override
	public int getRows() {
		//Die Anzahl der Zeichen ist oben und unten, wobei dekorative Zeichen hinzugefügt werden
		return 1 + display.getRows() + 1;
	}

	@Override
	public String getRowText(int row) {
		if (row == 0) {
			//Oberseite des Rahmens
			return "+" + makeLine('-', display.getColumns()) + '+';
		} else if (row == display.getRows() + 1) {
			//Die Unterseite des Rahmens
			return "+" + makeLine('-', display.getColumns()) + '+';
 		} else {
 			return "|" + display.getRowText(row - 1) + "|";
 		}
	}

	/**
	 *Erstellen Sie nacheinander bestimmte Zeichen
	 *
	 */
	private String makeLine(char ch, int count) {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < count; i++) {
			buf.append(ch);
		}
		return buf.toString();
	}
}

Anrufer

package decorator;

public class Main {
	public static void main(String[] args) {
		Display d1 = new StringDisplay("Hello world");
		Display d2 = new SideBorder(d1, '#');
		Display d3 = new FullBorder(d2);
		d1.show();
		d2.show();
		d3.show();
	}
}

Ausführungsergebnis

スクリーンショット 2020-09-09 14.19.22.png

Je mehr Sie es einpacken, desto mehr Funktionen werden hinzugefügt. Zu diesem Zeitpunkt kann die Funktion hinzugefügt werden, ohne die umwickelte Seite zu ändern.

https://github.com/aki0207/decorator

Ich habe dies als Referenz verwendet. weniger A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E -% E6% B5% A9 / dp / 4797327030 / ref = sr_1_1? Dh = UTF8 & qid = 1454743284 & sr = 8-1 & keywords = java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80 "> Augmented Revised Edition Einführung in in Java gelernte Entwurfsmuster

Recommended Posts

Dekorationsmuster
Dekorateur Muster
Entwurfsmuster ~ Dekorateur ~
Prototypmuster
Erinnerungsmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
Fassadenmuster
Fliegengewichtsmuster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster
abstraktes Fabrikmuster
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Java-Rückrufmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
[Java] Singleton-Muster
Entwurfsmuster ~ Befehl ~
Abstraktes Fabrikmuster
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Muster der Vorlagenmethode
Muster der Vorlagenmethode
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
[Java] Adaptermuster
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Java-Muster-Memo
Refactor die Implementierung des Decorator-Musters mit einer funktionalen Schnittstelle