[JAVA] Modèle de conception ~ Décorateur ~

1.Tout d'abord

Voici un résumé du ** modèle de décorateur ** dans le modèle de conception du GoF.

2. Quel est le modèle Decorator?

3. Exemple de diagramme de classes

Decorator.PNG

4. Exemple de programme

Il s'agit d'un programme qui décore la chaîne de caractères saisie avec un cadre.

4-1. Classe d'affichage

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));
		}
	}
}

4-2. Classe StringDisplay

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;
	}
}

4-3. Classe de bordure

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;
	}
}

4-4. Classe SideBorder

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) + "*";
	}
}

4-5. Classe FullBorder

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();
	}
}

4-6. Classe principale

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();
	}
}

4-7. Résultat de l'exécution

Hello world

*Hello world*

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

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

5. Avantages

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é.

  1. GitHub

7. Liste des modèles de conception

8. Référence

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

Modèle de conception ~ Décorateur ~
Motif décorateur
Motif décorateur
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception ~ Proxy ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de prototype
Motif de souvenir
Motif médiateur
Modèle d'itérateur
Motif composite
Modèle d'observateur
Modèle de constructeur
Modèle de pont
Modèle de commande
Modèle de constructeur
Modèle de stratégie
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de façade
Modèle de poids mouche
Modèle de médiateur
Motif de façade
Modèle de visiteur
Modèle de pont
PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -