[JAVA] Brückenmuster

Was ist das Brückenmuster?

Es verbindet die "Funktionsklassenhierarchie" und die "Implementierungsklassenhierarchie". Wikipedia gibt an, dass der Zweck darin besteht, die Klasse in mehrere Richtungen zu erweitern, indem eine "Brücken" -Klasse bereitgestellt wird.

Die Rolle der Abstraktion

Die Spitzenklasse in der "Funktionsklassenhierarchie". Eine Klasse, in der nur Grundfunktionen mit der Implementierungsmethode beschrieben werden. Diese Klasse hat die Rolle des Implementierers.

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

Die Rolle der verfeinerten Abstraktion

Eine Rolle mit zusätzlichen Funktionen zur Abstraktionsrolle.

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

Die Rolle des Implementierers

Die oberste Klasse der "Implementierungsklassenhierarchie". Eine Rolle, die eine Methode zum Implementieren einer Schnittstelle für die Rolle der Abstraktion definiert.

package bridge;

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

Die Rolle des konkreten Implementierers

Insbesondere die Rolle der Implementierung der Schnittstelle der Rolle des Implementierers.

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

Anrufer

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

Ausführungsergebnis

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

Fügen Sie eine Klasse hinzu, die das folgende Muster anzeigt. <> <*> <**> <***>

Dies sind das erste Zeichen → dekorative Zeichen mehrmals → das letzte Zeichen und der Zeilenumbruch als eine Zeile, die mehrmals wiederholt wird.

Wenn Sie eine Klasse hinzufügen, die wie oben beschrieben funktioniert, trennen Sie sie in eine Klasse, die "Funktion" darstellt, und eine Klasse, die "Implementierung" darstellt.

Eine Klasse, die die "Funktion" darstellt, immer öfter anzuzeigen

package bridge;

public class IncreaseDisplay extends CountDisplay {
	//Anzahl der Erhöhungen
	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;
		}
	}
}

Eine Klasse, die die "Implementierung" der Anzeige in Zeichen darstellt

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

Anrufer

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

Ausführungsergebnis

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

https://github.com/aki0207/bridge

Ich habe dies als Referenz verwendet. Augmented Revised Edition Einführung in in Java gelernte Entwurfsmuster

Recommended Posts

Brückenmuster
Brückenmuster
Entwurfsmuster ~ Brücke ~
Prototypmuster
Erinnerungsmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Besuchermuster
abstraktes Fabrikmuster
Entwurfsmuster ~ Builder ~
[Java] Strategiemuster
Entwurfsmuster ~ Besucher ~
Java-Rückrufmuster
Entwurfsmuster ~ Proxy ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Mediator ~
Muster der Vorlagenmethode
Muster der Vorlagenmethode
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
[Java] Adaptermuster
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Java-Muster-Memo