Heim Backend-Entwicklung PHP-Tutorial Objektorientiertes erweitertes Designmuster: Adaptermuster

Objektorientiertes erweitertes Designmuster: Adaptermuster

May 20, 2017 pm 02:35 PM
设计模式 适配器模式 面向对象

Was ist das Adaptermuster?

Das Adaptermuster passt einfach die Schnittstelle eines Objekts an die von einem anderen Objekt erwartete Schnittstelle an.

Probleme und Lösungen bei Adaptermusteranwendungen

In Ihrer Anwendung können Sie eine funktionierende Codebasis verwenden, die architektonisch zuverlässig und stabil ist. Aber wir fügen oft neue Funktionen hinzu, die es erfordern, vorhandene Objekte auf eine andere Art und Weise zu verwenden, als sie ursprünglich entworfen wurden. An dieser Stelle liegt das Hindernis möglicherweise einfach darin, dass die neue Funktion einen anderen Namen benötigt. In komplexeren Szenarien kann ein Hindernis auch darin bestehen, dass die neue Funktionalität ein etwas anderes Verhalten erfordert als das ursprüngliche Objekt.

Um das oben genannte Problem zu lösen, verwenden wir als Lösung das Adaptermuster, um ein anderes Objekt zu erstellen. Dieses Adapterobjekt fungiert als Vermittler zwischen der ursprünglichen Anwendung und der neuen Funktionalität. Das Adaptermuster definiert neue Schnittstellen für vorhandene Objekte, um den Anforderungen neuer Objekte gerecht zu werden.

Problem

Angenommen, die Funktionen der Alipay-Zahlungsklasse sind wie folgt:

/** 
 * 支付宝支付类 
 */  
class Alipay  
{  
    public function sendPayment()  
    {  
        echo '使用支付宝支付。';  
    }  
}  
  
// 客户端代码  
$alipay = new Alipay();  
$alipay->sendPayment();
Nach dem Login kopieren

Wir instanziieren die Alipay-Klasse direkt, um die Zahlung abzuschließen Funktion, so ein Client Es kann viel Code geben.

Was passiert nach einer gewissen Zeit, wenn die Alipay-Klasse von Alipay aktualisiert wird und sich der Methodenname von sendPayment() in goPayment() ändert?

Der gesamte Client-Code, der sendPayment() verwendet, muss geändert werden.

Wenn die Alipay-Klasse häufig aktualisiert wird oder der Client an vielen Orten verwendet wird, ist dies ein enormer Arbeitsaufwand.

Gelöst

Jetzt verwenden wir das Adaptermuster, um das Problem zu lösen.

Wir fügen eine Zwischenklasse, nämlich die Adapterklasse, zwischen dem Client und der Alipay-Klasse hinzu, um das ursprüngliche Alipay in die vom Client benötigte Form umzuwandeln.

Damit der Client eine einheitliche Klassenmethode aufrufen kann, definieren wir zunächst eine Adapterschnittstelle:

/** 
 * 适配器接口,所有的支付适配器都需实现这个接口。 
 * 不管第三方支付实现方式如何,对于客户端来说,都 
 * 用pay()方法完成支付 
 */  
interface PayAdapter  
{  
    public function pay();  
}
Nach dem Login kopieren

Da wir die Alipay-Klasse nicht steuern können und sie möglicherweise häufig aktualisiert wird, Daher werden keine Änderungen daran vorgenommen.

Wir erstellen eine neue AlipayAdapter-Adapterklasse und konvertieren die Zahlungsfunktion von Alipay in pay() wie folgt:

/** 
 * 支付宝适配器 
 */  
class AlipayAdapter implements PayAdapter  
{  
    public function pay()  
    {  
        // 实例化Alipay类,并用Alipay的方法实现支付  
        $alipay = new Alipay();  
        $alipay->sendPayment();  
    }  
}
Nach dem Login kopieren

So verwenden Sie den Client:

// 客户端代码  
$alipay = new AlipayAdapter();  
// 用pay()方法实现支付  
$alipay->pay();
Nach dem Login kopieren

Wenn sich die Zahlungsmethode von Alipay ändert, müssen Sie auf diese Weise nur die AlipayAdapter-Klasse ändern.

Anpassung an neue Klassen

Mit Adaptern wird die Erweiterung einfacher.

Um mit dem obigen Beispiel fortzufahren, fügen wir auf der Grundlage von Alipay die WeChat-Zahlung hinzu. Der Unterschied zu Alipay besteht darin, dass Sie zum Bezahlen den QR-Code scannen müssen.

In diesem Fall sollten Sie auch einen Adapter verwenden, anstatt direkt die Bezahlfunktion von WeChat zu nutzen.

Der Code lautet wie folgt:

/** 
 * 微信支付类 
 */  
class WechatPay  
{  
    public function scan()  
    {  
        echo '扫描二维码后,';  
    }  
  
    public function doPay()  
    {  
        echo '使用微信支付';  
    }  
}  
  
/** 
 * 微信支付适配器 
 */  
class WechatPayAdapter implements PayAdapter  
{  
    public function pay()  
    {  
        // 实例化WechatPay类,并用WechatPay的方法实现支付。  
        // 注意,微信支付的方式和支付宝的支付方式不一样,但是  
        // 适配之后,他们都能用pay()来实现支付功能。  
        $wechatPay = new WechatPay();  
        $wechatPay->scan();  
        $wechatPay->doPay();  
    }  
}
Nach dem Login kopieren

Client-Nutzung:

// 客户端代码  
$wechat = new WechatPayAdapter();  
// 也是用pay()方法实现支付  
$wechat->pay();
Nach dem Login kopieren

Dies ist die Erweiterungsfunktion des Adapters.

Wir haben eine Methode für den Umgang mit Klassen von Drittanbietern (Alipay, WeChat Pay) erstellt.

Wenn sich deren APIs ändern, müssen wir nur die Adapterklasse ändern, von der der Client abhängt Ändern oder Offenlegen der Drittanbieterklasse selbst.

UML-Diagramm

Der Code für das obige Adaptermuster entspricht UML wie folgt:

Objektorientiertes erweitertes Designmuster: Adaptermuster

Zusammenfassung

Große Anwendungen werden weiterhin neue Bibliotheken und neue APIs hinzufügen.

Um Probleme zu vermeiden, die durch ihre Änderungen verursacht werden, sollten sie in das Adaptermuster gepackt werden, um eine einheitliche Referenzmethode für die Anwendung bereitzustellen.

Dadurch wird unser Code strukturierter und einfacher zu verwalten und zu erweitern.

Das obige ist der detaillierte Inhalt vonObjektorientiertes erweitertes Designmuster: Adaptermuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erweiterte PHP-Funktionen: Best Practices in der objektorientierten Programmierung Erweiterte PHP-Funktionen: Best Practices in der objektorientierten Programmierung Jun 05, 2024 pm 09:39 PM

Zu den OOP-Best Practices in PHP gehören Namenskonventionen, Schnittstellen und abstrakte Klassen, Vererbung und Polymorphismus sowie Abhängigkeitsinjektion. Zu den praktischen Fällen gehören: Verwenden des Lagermodus zum Verwalten von Daten und Verwenden des Strategiemodus zum Implementieren der Sortierung.

Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Jun 02, 2024 pm 12:59 PM

Im Java-Framework besteht der Unterschied zwischen Entwurfsmustern und Architekturmustern darin, dass Entwurfsmuster abstrakte Lösungen für häufige Probleme beim Softwaredesign definieren und sich dabei auf die Interaktion zwischen Klassen und Objekten konzentrieren, beispielsweise Fabrikmuster. Architekturmuster definieren die Beziehung zwischen Systemstrukturen und Modulen und konzentrieren sich auf die Organisation und Interaktion von Systemkomponenten, wie z. B. eine geschichtete Architektur.

Vertieftes Verständnis der objektorientierten PHP-Programmierung: Debugging-Techniken für die objektorientierte Programmierung Vertieftes Verständnis der objektorientierten PHP-Programmierung: Debugging-Techniken für die objektorientierte Programmierung Jun 05, 2024 pm 08:50 PM

Indem Sie das Verfolgen des Objektstatus, das Setzen von Haltepunkten, das Verfolgen von Ausnahmen und die Verwendung der xdebug-Erweiterung beherrschen, können Sie objektorientierten PHP-Programmiercode effektiv debuggen. 1. Objektstatus verfolgen: Verwenden Sie var_dump() und print_r(), um Objektattribute und Methodenwerte anzuzeigen. 2. Legen Sie einen Haltepunkt fest: Legen Sie einen Haltepunkt in der Entwicklungsumgebung fest. Wenn die Ausführung den Haltepunkt erreicht, wird der Debugger angehalten, sodass der Objektstatus einfacher überprüft werden kann. 3. Ausnahmen verfolgen: Verwenden Sie Try-Catch-Blöcke und getTraceAsString(), um den Stack-Trace und die Meldung abzurufen, wenn die Ausnahme auftritt. 4. Verwenden Sie den Debugger: Die Funktion xdebug_var_dump() kann den Inhalt von Variablen während der Codeausführung überprüfen.

Analyse des Decorator-Musters in Java-Entwurfsmustern Analyse des Decorator-Musters in Java-Entwurfsmustern May 09, 2024 pm 03:12 PM

Das Dekoratormuster ist ein strukturelles Entwurfsmuster, das das dynamische Hinzufügen von Objektfunktionen ermöglicht, ohne die ursprüngliche Klasse zu ändern. Es wird durch die Zusammenarbeit von abstrakten Komponenten, konkreten Komponenten, abstrakten Dekoratoren und konkreten Dekoratoren implementiert und kann Klassenfunktionen flexibel erweitern, um sich ändernden Anforderungen gerecht zu werden. In diesem Beispiel werden Milch- und Mokka-Dekoratoren zu Espresso für einen Gesamtpreis von 2,29 $ hinzugefügt, was die Leistungsfähigkeit des Dekoratormusters bei der dynamischen Änderung des Verhaltens von Objekten demonstriert.

Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern May 09, 2024 pm 12:54 PM

Das Adaptermuster ist ein strukturelles Entwurfsmuster, das die Zusammenarbeit inkompatibler Objekte ermöglicht. Es wandelt eine Schnittstelle in eine andere um, sodass die Objekte reibungslos interagieren können. Der Objektadapter implementiert das Adaptermuster, indem er ein Adapterobjekt erstellt, das das angepasste Objekt enthält, und die Zielschnittstelle implementiert. In einem praktischen Fall kann der Client (z. B. MediaPlayer) über den Adaptermodus Medien im erweiterten Format (z. B. VLC) abspielen, obwohl er selbst nur normale Medienformate (z. B. MP3) unterstützt.

PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis Jun 03, 2024 pm 02:14 PM

TDD wird verwendet, um hochwertigen PHP-Code zu schreiben. Die Schritte umfassen: Testfälle schreiben, die erwartete Funktionalität beschreiben und sie zum Scheitern bringen. Schreiben Sie Code so, dass nur die Testfälle ohne übermäßige Optimierung oder detailliertes Design erfolgreich sind. Nachdem die Testfälle bestanden wurden, optimieren und überarbeiten Sie den Code, um die Lesbarkeit, Wartbarkeit und Skalierbarkeit zu verbessern.

Anwendung von Designmustern im Guice-Framework Anwendung von Designmustern im Guice-Framework Jun 02, 2024 pm 10:49 PM

Das Guice-Framework wendet eine Reihe von Entwurfsmustern an, darunter: Singleton-Muster: Durch die @Singleton-Annotation wird sichergestellt, dass eine Klasse nur eine Instanz hat. Factory-Methodenmuster: Erstellen Sie eine Factory-Methode über die Annotation @Provides und rufen Sie die Objektinstanz während der Abhängigkeitsinjektion ab. Strategiemodus: Kapseln Sie den Algorithmus in verschiedene Strategieklassen und geben Sie die spezifische Strategie über die Annotation @Named an.

Was sind die Vor- und Nachteile der Verwendung von Entwurfsmustern im Java-Framework? Was sind die Vor- und Nachteile der Verwendung von Entwurfsmustern im Java-Framework? Jun 01, 2024 pm 02:13 PM

Zu den Vorteilen der Verwendung von Entwurfsmustern in Java-Frameworks gehören: verbesserte Lesbarkeit, Wartbarkeit und Skalierbarkeit des Codes. Zu den Nachteilen gehören Komplexität, Leistungsaufwand und eine steile Lernkurve aufgrund übermäßiger Nutzung. Praktischer Fall: Der Proxy-Modus wird zum verzögerten Laden von Objekten verwendet. Setzen Sie Entwurfsmuster mit Bedacht ein, um ihre Vorteile zu nutzen und ihre Nachteile zu minimieren.

See all articles