Adaptermodus
Das Definieren eines Adaptermusters (Englisch: Adaptermuster) wird manchmal als Verpackungsstil oder Verpackung bezeichnet. Übertragen Sie eine Schnittstelle einer Klasse auf das, was der Benutzer erwartet. Eine Anpassung macht Klassen, die aufgrund der Interface -Inkompatibilität nicht zusammenarbeiten können.
Es gibt zwei Arten von Adaptermodi:
1. Objektadaptermodus - Der Objektadapter erfüllt die Erwartungsschnittstelle des Benutzers durch Assoziation und reduziert auch die schlechte Kopplung zwischen Codes. Es wird empfohlen, "Objektanpassung" in Ihrer Arbeit zu verwenden.
2. Klassenadaptermodus - In diesem Adaptermodus erbt der Adapter seine implementierten Klassen (normalerweise multiple Vererbung). In Java gibt es kein mehrfacher Erbe, daher werde ich es hier nicht vorstellen.
erreichen
1. Ziel - Definiert die Methode, die der Client verwenden muss.
2. Adapter - Erben oder implementieren Sie Ziel und passen Sie sie an Adapte -Methoden an, um Ziele zu erzielen.
3. Depapee - Definieren Sie eine vorhandene Methode.
4. Client - Aufrufmethoden im Ziel.
public class apapee {public void spezifischRequest () {System.out.println ("Hallo, ich bin von Adaptinen!"); }} public interface Ziel {public void request (); } public class Adapter implementiert Target {Adapteste Adaptee; public adapter () {apapee = new apapee (); } public void request () {apapee.SpecificRequest (); }} public class Client {public static void main (string [] args) {target target = new adapter (); Target.Request (); }}Um das Klassenadaptermuster zu implementieren, benötigen wir Adapter, um den Adaptierten zu erben.
Anwendbare Szenarien
1. Wenn Sie eine alte Klasse verwenden möchten und ihre Benutzeroberfläche Ihren Anforderungen nicht entspricht, können Sie die Adapterklasse als Mediationsklasse verwenden.
2. Sie möchten eine allgemeine Klasse erstellen, in der einige Schnittstellen einiger nicht verwandter Klassen aufrufen können, die Sie verwenden können.
Brückenmodus
Motivation Manchmal sollte ein Abstract unterschiedliche Implementierungen haben. Zum Beispiel gibt es zwei Möglichkeiten, Daten zu speichern, eine ist die Dateimethode und die andere ist die Datenbankmethode. Die übliche Praxis besteht darin, die Klasse zu erben, die Daten speichert und dann verschiedene Möglichkeiten zum Speichern von Daten implementiert. Das Problem dabei ist, dass es schwierig ist, die Speichermethode zu ändern und zu erweitern, und die Speichermethode kann nicht zur Laufzeit umgeschaltet werden.
Das Definieren eines Brückenmusters ist eines der komplexesten Muster in einem Software -Design -Muster, das die abstrakten Teile der Dinge von seinen Implementierungsteilen trennt, sodass sie alle unabhängig voneinander verändern können.
Zum Beispiel werden "Kreis" und "Dreieck" unter die abstrakte "Form" klassifiziert, während "Zeichnenkreis" und "Zeichnen von Dreieck" unter der Kategorie "Zeichnen" klassifiziert werden, die das Verhalten realisiert, und dann "Zeichnen" von "Form" bezeichnet.
1.. Abstract - abstrakte Methoden definieren.
2. AbstractImpl - Verwenden Sie die Implementierungsschnittstelle, um abstrakte Methoden zu implementieren.
3. Implementierer - Definiert Schnittstellen für bestimmte Implementierungsverhalten.
4. ConcreteImplementor1, ConcreteImplementor2 - Implementieren Sie die Implementierschnittstelle.
/ ** "Implementierer"*/ Schnittstelle Drawingapi {public void Drawcircle (Double X, Double Y, Doppelradius); }/** "ConcreteImplementor" 1/2*/Class DrawingAPI1 implementiert Drainapi {public void drawcircle (Double X, Double Y, Doppelradius) {System.out.printf ("api1.circle bei %f: %f radius %f/n", x, y, Radius); }}/** "ConcreteImplementor" 2/2*/Class DrawingAPI2 implementiert Drainapi {public void drawcircle (Double X, Double Y, Double Radius) {System.out.printf ("api2.circle bei %f: %f radius %f/n", x, y, Radius); }} / ** "Abstraktion"* / Schnittstellenform {public void Draw (); // öffentliche void-Absolventen von Low-Level-Level (Double PCT); // hohe Ebene}/ ** "verfeinerte Abstraktion"*/ Class Circleshape implementiert Form {private Double X, Y, Radius; private Drawapi Drawtapi; public circleshape (double x, double y, doppelt radius, drawtapi drawtapi) {this.x = x; this.y = y; this.Radius = Radius; this.drawingapi = Drawingapi; } // Low-Level-IE-Implementierungspezifische öffentliche void Draw () {DrawingAPI.Drawcircle (x, y, Radius); } // hohe Ebene, dh abstrakte spezifische öffentliche void-resizypercentage (double pct) {radius *= pct; }} / ** "client"* / class Bridgepattern {public static void main (string [] args) {form [] formes = new Shape [2]; Formen [0] = neuer Circleshape (1, 2, 3, New DrawingAPI1 ()); Formen [1] = neuer Circleshape (5, 7, 11, New DrawingAPI2 ()); für (Formform: Formen) {Form.ResizeBypercentage (2.5); form.draw (); }}} Beispiel
1. Speichern Sie die in der Motivation genannten Daten.
2. Zeichnungsrahmen der Grafik. Ähnlich wie bei der Implementierung im obigen Code.
Anwendbare Szenarien
1. Sie möchten nicht, dass die Abstraktion und Implementierung eine feste Beziehung haben, aber Sie hoffen, dass die Implementierung zur Laufzeit geändert werden kann.
2. Sowohl abstrakte als auch Implementierungsteile können unabhängig erweitert werden, ohne sich gegenseitig zu beeinflussen.