Décorez l'objet.
Le rôle principal lors de l'ajout de fonctions.
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));
}
}
}
Un rôle qui implémente l'interface du rôle Component.
package decorator;
/**
*Une classe qui affiche une seule ligne de texte
*/
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;
}
}
A la même interface que le rôle de composant. En outre, il a un rôle de composant qui est la cible du rôle de décorateur. Ce rôle sait ce qu'il veut décorer.
package decorator;
/**
*Classe qui représente un cadre décoratif
*/
public abstract class Border extends Display {
//Fait référence au "contenu" dans lequel ce cadre décoratif est enveloppé
protected Display display;
protected Border(Display display) {
this.display = display;
}
}
Le rôle d'un décorateur de béton.
package decorator;
/**
*Une classe qui décore les côtés gauche et droit d'une chaîne de caractères avec des caractères fixes
*
*/
public class SideBorder extends Border {
private char borderChar;
protected SideBorder(Display display, char ch) {
super(display);
this.borderChar = ch;
}
@Override
public int getColumns() {
//Le nombre de caractères est le nombre de caractères décoratifs ajoutés des deux côtés
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;
/**
*Classe pour décorer haut, bas, gauche et droite
*
*/
public class FullBorder extends Border{
protected FullBorder(Display display) {
super(display);
}
@Override
public int getColumns() {
//Le nombre de caractères est le nombre de caractères décoratifs ajoutés des deux côtés
return 1 + display.getColumns() + 1;
}
@Override
public int getRows() {
//Le nombre de caractères est le haut et le bas avec des caractères décoratifs ajoutés
return 1 + display.getRows() + 1;
}
@Override
public String getRowText(int row) {
if (row == 0) {
//Face supérieure du cadre
return "+" + makeLine('-', display.getColumns()) + '+';
} else if (row == display.getRows() + 1) {
//Le bas du cadre
return "+" + makeLine('-', display.getColumns()) + '+';
} else {
return "|" + display.getRowText(row - 1) + "|";
}
}
/**
*Créer des caractères spécifiés successivement
*
*/
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();
}
}
Plus vous l'enroulez, plus de fonctions seront ajoutées. À ce moment-là, la fonction peut être ajoutée sans changer le côté enveloppé.
https://github.com/aki0207/decorator
Je l'ai utilisé comme référence. Édition révisée augmentée Introduction aux modèles de conception appris en langage Java
Recommended Posts