[JAVA] Modèle de pont

Quel est le modèle de pont?

Il relie la «hiérarchie des classes fonctionnelles» et la «hiérarchie des classes d'implémentation». wikipedia déclare que le but est d'étendre la classe dans plusieurs directions en fournissant une classe «pont».

Le rôle de l'abstraction

La classe supérieure de la "Hiérarchie des classes de fonctions". Une classe dans laquelle seules les fonctions de base sont décrites en utilisant la méthode de Implementor. Cette classe tient le rôle d'implémenteur.

package bridge;

public class Display {
	private DisplayImpl impl;

	public Display(DisplayImpl impl) {
		this.impl = impl;
	}

	public void open() {
		impl.rawOpen();
	}

	public void print() {
		impl.rawPrint();
	}

	public void close() {
		impl.rawClose();
	}

	public final void display() {
		open();
		print();
		close();
	}
}

Le rôle de l'abstraction raffinée

Un rôle avec des fonctions ajoutées au rôle Abstraction.

package bridge;

public class CountDisplay extends Display {
	public CountDisplay(DisplayImpl impl) {
		super(impl);
	}

	public void multiDisplay(int times) {
		open();
		for (int i = 0; i < times; i++) {
			print();
		}
		close();
	}
}

Le rôle du réalisateur

La classe supérieure de la "hiérarchie des classes d'implémentation". Un rôle qui définit une méthode pour implémenter une interface pour le rôle d'Abstraction.

package bridge;

public abstract class DisplayImpl {
	public abstract void rawOpen();
	public abstract void rawPrint();
	public abstract void rawClose();
}

Le rôle de Concrete Implementor

Plus précisément, le rôle d'implémentation de l'interface du rôle d'implémenteur.

package bridge;

public class StringDisplayImpl extends DisplayImpl {
	private String string;
	private int width;

	public StringDisplayImpl(String string) {
		this.string = string;
		this.width = string.getBytes().length;
	}

	public void rawOpen() {
		printLine();
	}

	public void rawPrint() {
		System.out.println("|" + string + "|");
	}

	public void rawClose() {
		printLine();
	}

	public void printLine() {
		System.out.print("+");
		for (int i = 0; i < width; i++) {
			System.out.print("-");
		}
		System.out.println("+");
	}
}

Votre interlocuteur

package bridge;

public class Main {
	public static void main(String[] args) {
		Display d1 = new Display(new StringDisplayImpl("Hello Japan"));
		Display d2 = new CountDisplay(new StringDisplayImpl("Hello World"));
		CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello Universe"));
		d1.display();
		d2.display();
		d3.display();
		d3.multiDisplay(5);
	}
}

Résultat d'exécution

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

Ajoutez une classe qui affiche le modèle suivant. <> <*> <**> <***>

Ce sont le premier caractère → les caractères décoratifs plusieurs fois → le dernier caractère et le saut de ligne en une seule ligne, qui est répétée plusieurs fois.

Lorsque vous ajoutez une classe qui fonctionne comme ci-dessus, séparez-la en une classe qui représente «fonction» et une classe qui représente «implémentation».

Une classe qui représente la «fonction» d'afficher de plus en plus de fois

package bridge;

public class IncreaseDisplay extends CountDisplay {
	//Nombre d'augmentation
	private int step;

	public IncreaseDisplay(DisplayImpl impl, int step) {
		super(impl);
		this.step = step;
	}

	public void increaseDisplay(int level) {
		int count = 0;
		for (int i = 0; i < level; i++) {
			multiDisplay(count);
			count += step;
		}
	}
}

Une classe qui représente "l'implémentation" de l'affichage en caractères

package bridge;

public class CharDisplayImpl extends DisplayImpl {
	private String firstLetter;
	private String decoration;
	private String lastLetter;

	public CharDisplayImpl(String firstLetter, String decoration, String lastLetter) {
		this.firstLetter = firstLetter;
		this.decoration = decoration;
		this.lastLetter = lastLetter;
	}

	@Override
	public void rawOpen() {
		System.out.print(firstLetter);
	}

	@Override
	public void rawPrint() {
		System.out.print(decoration);
	}

	@Override
	public void rawClose() {
		System.out.println(lastLetter);
	}
}

Votre interlocuteur

package bridge;

public class Main {
	public static void main(String[] args) {
		Display d1 = new Display(new StringDisplayImpl("Hello Japan"));
		Display d2 = new CountDisplay(new StringDisplayImpl("Hello World"));
		CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello Universe"));
		IncreaseDisplay d4 = new IncreaseDisplay(new CharDisplayImpl("<", "*", ">"), 2);
		d1.display();
		d2.display();
		d3.display();
		d3.multiDisplay(5);
		d4.increaseDisplay(3);
	}
}

Résultat d'exécution

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

https://github.com/aki0207/bridge

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

Modèle de pont
Modèle de pont
Modèle de conception ~ Pont ~
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 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 façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Modèle de médiateur
Motif de façade
Modèle de visiteur
modèle d'usine abstrait
Modèle de conception ~ Constructeur ~
[Java] Modèle de stratégie
Modèle de conception ~ Visiteur ~
modèle de rappel java
Modèle de conception ~ Proxy ~
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
Modèle de conception ~ Commande ~
Modèle de conception ~ Façade ~
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 ~
Mémo de modèle Java