Dekoriere das Objekt.
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));
}
}
}
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;
}
}
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 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();
}
}
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();
}
}
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