Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie in einem Artikel mehr über das Adaptermuster in PHP

Erfahren Sie in einem Artikel mehr über das Adaptermuster in PHP

青灯夜游
青灯夜游nach vorne
2021-06-29 19:12:473546Durchsuche

Im vorherigen Artikel „Ein kurzer Vortrag über das Decorator-Muster in PHP“ haben wir das Decorator-Muster in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Adaptermusters in PHP.

Erfahren Sie in einem Artikel mehr über das Adaptermuster in PHP

Dieses Modell hatte schon immer ein sehr klassisches Vorbild, und das ist der Sockel! Richtig, wenn wir Elektrogeräte im Ausland kaufen oder geschäftlich ins Ausland reisen, benötigen wir oft einen Netzadapter, da in unserem Land die Spannungsnorm 220 Volt beträgt, während in anderen Ländern die Spannungsnorm 110 Volt beträgt. Und dieses Netzteil ist ein Symbol für den Adaptermodus. Wenn das Objekt die Anforderungen nicht erfüllt, fügen Sie einen Adapter hinzu! !

Gof-Klassendiagramm und Erklärung

GoF-Definition: Konvertieren Sie die Schnittstelle einer Klasse in eine andere Schnittstelle, die der Kunde wünscht. Das Adaptermuster ermöglicht die Zusammenarbeit von Klassen, die ursprünglich aufgrund inkompatibler Schnittstellen nicht zusammenarbeiten konnten

interface Target{
    function Request() : void;
}
Definieren Sie einen Schnittstellenvertrag, der auch eine normale Klasse mit Implementierungsmethoden sein kann (wir werden Klassen in den folgenden Beispielen verwenden)

class Adapter implements Target{
    private $adaptee;

    function __constuct($adaptee){
        $this->adaptee = $adaptee;
    }

    function Request() : void {
        $this->adaptee->SpecificRequest();
    }
}

Der Adapter implementiert diesen Schnittstellenvertrag, damit die Methode Request() implementiert werden kann, aber bitte beachten Sie, dass wir Eigentlich ist call eine Methode in der Adaptee-Klasse.

class Adaptee {
    function SpecificRequest() : void{
        echo "I'm China Standard!";
    }
}

Adapter gibt es in zwei Formen. Wie im obigen Klassendiagramm gezeigt, wird die kombinierte Form der von unserem Code implementierten

Vererbungsform in C++ im GoF-Buch veranschaulicht. Da C ++ eine Mehrfachvererbung implementieren kann, liegen die meisten gängigen Sprachen in Form von Schnittstellen vor, die ebenfalls implementiert werden können. Es gibt jedoch nicht viele Adapter, die diese Form verwenden. Tatsächlich handelt es sich immer noch um eine Art Denkweise Für die schnittstellenorientierte Programmierung, ähnlich wie bei der Verwendung von Dekoratoren, haben wir hier die Verpackung der alten Funktionen direkt ersetzt, aber die externen Aufrufe bleiben gleich

Erfahren Sie in einem Artikel mehr über das Adaptermuster in PHPDer Adaptermodus ist eigentlich leicht zu verstehen, der Code hat wirklich nur so viel

Lassen Sie uns noch einmal über meine Handyfabrik sprechen, unser Geschäft ist dieses Mal wirklich gewachsen! Es wurde nach Thailand, Singapur und Indonesien verkauft. Wir sind jedenfalls überall dort zu finden, wo es Curry gibt. Es heißt, wir hätten eine Curryfarbe hergestellt. Der Muschelwechsel ist nicht ausschließlich auf den Einfluss von Noah zurückzuführen, aber nach langfristiger Forschung haben wir herausgefunden, dass sich unterschiedliche Farben an verschiedenen Orten besser verkaufen lassen. Deshalb hat Foxconn für uns einen Sprühadapter (Adapter) in der Original-Handyhüllen-Produktionslinie (Target) installiert. Wenn wir Hüllen in anderen Farben benötigen, benötigen wir diesen Adapter nur zum Wechseln verschiedener Farben (Adaptee). Installieren Sie diesen Sprüher direkt. und ein neues farbiges Mobiltelefon ist geboren. Wenn wir unser Geschäft in ein anderes Land ausdehnen, müssen wir nur die Farbe wechseln. Wenn es zu lange dauert, tauschen wir auch die Düse aus (denken Sie an den Dauerdrucker)Erfahren Sie in einem Artikel mehr über das Adaptermuster in PHP

Vollständiger Code: Adaptermodus

https:/ /github .com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter.php

Beispiel
  • Senden Sie weiterhin Textnachrichten, um zu sehen, wann ich sie kompilieren kann~~~
  • Alle Beim Herstellen einer Verbindung B. Informations- und Zahlungsschnittstellen, werden häufig die von diesen Plattformen bereitgestellten SDKs verwendet. Insbesondere mit Composer ist es bequemer, das SDK zu installieren. Es gibt jedoch ein weiteres ernstes Problem. Obwohl die von diesen Leuten erstellten SDKs ähnliche Funktionen haben, sind ihre Namen sehr unterschiedlich. ! Unser System hat immer die Dienste von Alibaba Cloud genutzt, aber dieses Mal müssen wir die Informationsfunktionen von Jiguang und Baidu Cloud hinzufügen, erstens als Backup und zweitens, um je nach Dienst unterschiedliche Schnittstellen zu verwenden, um Sicherheit oder wirtschaftliche Zwecke zu erreichen Gibt es eine Möglichkeit? Ihre externen Schnittstellen so zu vereinheitlichen, dass die Verwendung ihres SDK sehr praktisch ist und mit der Alibaba Cloud-Schnittstelle identisch ist, an die jeder bereits gewöhnt ist? Geben Sie ihnen natürlich einfach jeweils einen Adapter. Bei der Instanziierung können Sie einfach eine externe Factory einrichten, um verschiedene Adapter zurückzugeben. Solange die Implementierungsmethode im Adapter mit der von Alibaba Cloud übereinstimmt, ist dies in Ordnung.
  • SMS-Versandklassendiagramm

Vollständiger Quellcode: SMS-Versandadaptermethode

https://github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter- Nachricht .php

<?php

class Message{
    public function send(){
        echo "阿里云发送短信!" . PHP_EOL;
    }
    public function push(){
        echo "阿里云发送推送!" . PHP_EOL;
    }
}

class JiguangSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->send_out_msg();
    }
    public function push(){
        $this->message->push_msg();
    }
}

class JiguangMessage{
    public function send_out_msg(){
        echo "极光发送短信!" . PHP_EOL;
    }
    public function push_msg(){
        echo "极光发送推送!" . PHP_EOL;
    }
}
class BaiduYunSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->transmission_msg();
    }
    public function push(){
        $this->message->transmission_push();
    }
}
class BaiduYunMessage{
    public function transmission_msg(){
        echo "百度云发送短信!" . PHP_EOL;
    }
    public function transmission_push(){
        echo "百度云发送推送!" . PHP_EOL;
    }
}

$jiguangMessage = new JiguangMessage();
$baiduYunMessage = new BaiduYunMessage();
$message = new Message();

// 原来的老系统发短信,使用阿里云
$message->send();
$message->push();


// 部分模块用极光发吧
$jgAdatper = new JiguangSDKAdapter($jiguangMessage);
$jgAdatper->send();
$jgAdatper->push();

// 部分模块用百度云发吧
$bdAatper = new BaiduYunSDKAdapter($baiduYunMessage);
$bdAatper->send();
$bdAatper->push();

Beschreibung:
  • In diesem Beispiel haben wir zwei Adapter, weil wir zwei SDKs anpassen müssen. Wer sagt, dass es nur einen Stromwandler geben kann? Erben Sie die Message-Klasse, da es sich bei der Message-Klasse um zuvor geschriebenen Code handelt und möglicherweise einige öffentliche Methoden darin enthalten sind, sodass keine Schnittstellenabstraktion erfolgt. Sie können beim Refactoring des Codes das Extrahieren einer abstrakten Schnittstelle in Betracht ziehen. Dies dient jedoch nur dazu, zu demonstrieren, dass der Adapter möglicherweise nicht nur auf die Schnittstelle abzielen kann, solange diese mit dem ursprünglichen Objekt übereinstimmt. Es ist in Ordnung, nichts zu erben . Schließlich sind wir eine schwach typisierte Sprache. Wenn es sich um einen starken Typ handelt, der Java ähnelt, ist immer noch Vererbung oder Implementierung erforderlich (Polymorphismus).
  • Kombinierte Adapter ähneln Dekoratoren, sie verwalten ein externes Objekt und Dekoratoren Zum Hinzufügen von Funktionen werden die ursprünglichen Methoden in der Klasse verwendet, während Adapter selten das Filesystem-Modul in
  • Laravel ersetzen. Ich denke, dazu gibt es nicht viel zu sagen Jeder, der das Adaptermuster verwendet, sollte es sorgfältig studieren.
  • Wenn Sie eine Klasse verwenden möchten, deren Inhalt jedoch nicht zu Ihrem Unternehmen passt, oder wenn Sie eine Klasse erstellen möchten, die mit anderen Klassen verwendet werden kann Wenn Klassen oder unvorhergesehene Klassen zusammenarbeiten, können Sie auch das Adaptermuster ausprobieren
  • Empfohlenes Lernen: „
PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über das Adaptermuster in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen