Voici un résumé du ** modèle de décorateur ** dans le modèle de conception du GoF.
Il s'agit d'un programme qui décore la chaîne de caractères saisie avec un cadre.
Une classe abstraite pour afficher des chaînes de caractères.
Display.java
public abstract class Display {
//Obtenez le nombre de caractères horizontaux
public abstract int getColumns();
//Obtenez le nombre de lignes verticales
public abstract int getRows();
//Récupère la chaîne sur la ligne spécifiée
public abstract String getRowText(int row);
public void show() {
for (int i = 0; i < getRows(); i++) {
System.out.println(getRowText(i));
}
}
}
Cette classe permet d'afficher une chaîne de caractères composée d'une seule ligne.
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;
}
}
Une classe abstraite qui représente un cadre décoratif.
Border.java
public abstract class Border extends Display {
protected Display display;
protected Border(Display display) {
this.display = display;
}
}
Cette classe a des cadres décoratifs à gauche et à droite.
SideBorder.java
public class SideBorder extends Border {
public SideBorder(Display display) {
super(display);
}
public int getColumns() {
//Le nombre de caractères est le nombre de caractères décoratifs ajoutés des deux côtés du contenu
return 1 + display.getColumns() + 1;
}
public int getRows() {
//Le nombre de lignes est le même que le nombre de lignes dans le contenu
return display.getRows();
}
public String getRowText(int row) {
return "*" + display.getRowText(row) + "*";
}
}
Cette classe a des cadres décoratifs en haut, en bas, à gauche et à droite.
FullBorder.java
public class FullBorder extends Border {
public FullBorder(Display display) {
super(display);
}
public int getColumns() {
//Le nombre de caractères est le nombre comprenant les caractères décoratifs gauche et droit des deux côtés du contenu
return 1 + display.getColumns() + 1;
}
public int getRows() {
//Le nombre de lignes est le nombre de lignes à l'intérieur plus les caractères décoratifs supérieurs et inférieurs
return 1 + display.getRows() + 1;
}
public String getRowText(int row) {
if (row == 0) {
//Cadre supérieur
return "+" + makeLine('-', display.getColumns()) + "+";
} else if (row == display.getRows() + 1) {
//Châssis inférieur
return "+" + makeLine('-', display.getColumns()) + "+";
} else {
//autre que ça
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();
}
}
Cette classe effectue le traitement principal.
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();
}
}
Hello world
*Hello world*
+-------------+
|*Hello world*|
+-------------+
+---------------+
|*+-----------+*|
|*|Hello japan|*|
|*+-----------+*|
+---------------+
Dans le modèle Decorator, la bordure et le contenu (String Display) ont une interface commune. L'interface est la même, mais plus vous l'enveloppez, plus vous ajoutez de fonctionnalités. À ce moment-là, il n'est pas nécessaire de modifier la personne qui est enveloppée. Vous pouvez ajouter des fonctionnalités sans modifier ce qui est enveloppé.
Cet article et exemple de programme ont été créés à partir des livres suivants.
C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.
Recommended Posts