[JAVA] Motif décorateur

Quel est le modèle Derocator?

Décorez l'objet.

Le rôle du composant

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

Le rôle du composant béton

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

Le rôle du décorateur

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 du décorateur en béton

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

Votre interlocuteur

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

Résultat d'exécution

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

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

Motif décorateur
Motif décorateur
Modèle de conception ~ Décorateur ~
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 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 façade
Modèle de poids mouche
Modèle de médiateur
Motif de façade
Modèle de visiteur
Modèle de pont
modèle d'usine abstrait
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
modèle de rappel java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de méthode d'usine
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
[Java] Motif singleton
Modèle de conception ~ Commande ~
Modèle d'usine abstraite
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de méthode de modèle
Modèle de modèle de méthode
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
[Java] Modèle d'adaptateur
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Mémo de modèle Java
Refactoriser l'implémentation du pattern Decorator avec une interface fonctionnelle