Heim > Backend-Entwicklung > PHP-Tutorial > Eine kurze Diskussion über den Bridge-Modus in PHP

Eine kurze Diskussion über den Bridge-Modus in PHP

青灯夜游
Freigeben: 2023-04-10 11:44:01
nach vorne
2930 Leute haben es durchsucht

Im vorherigen Artikel „Lassen Sie uns über den Memo-Modus in PHP sprechen“ haben wir den Memo-Modus in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Bridge-Modus im PHP-Entwurfsmuster.

Eine kurze Diskussion über den Bridge-Modus in PHP

Der Bridge-Modus ist in der Programmierwelt eigentlich gleichbedeutend mit Kombination/Aggregation. Warum sagst du das? Wir, die mit der Objektorientierung vertraut sind, kennen alle die Vorteile der Vererbung. Unterklassen können viele Attribute und Funktionen der übergeordneten Klasse teilen. Allerdings bringt die Vererbung auch ein Problem mit sich, nämlich eine ernsthafte Kopplung. Änderungen an der übergeordneten Klasse haben Auswirkungen auf die Unterklassen, und selbst eine Änderung einer Methode oder eines Attributs kann eine Änderung aller Unterklassen erfordern. Dies verstößt gegen das Prinzip der offenen Kapselung. Durch Bridging soll dieses Problem gelöst werden. Der Schwerpunkt liegt auf der Verwendung von Kombinationen/Aggregationen, um einige verfügbare Methoden gemeinsam zu nutzen. Ich glaube, Sie haben sicher über Eigenschaften in PHP nachgedacht. Wenn Sie diese Funktion bei der Arbeit verwendet haben, haben Sie bereits den Bridge-Modus verwendet!

Gof-Klassendiagramm und Erklärung

GoF-Definition: Trennen Sie den abstrakten Teil von seinem Implementierungsteil, damit sie sich unabhängig voneinander ändern können.

GoF-Klassendiagramm

Eine kurze Diskussion über den Bridge-Modus in PHP

Code-Implementierung

interface Implementor
{
    public function OperationImp();
}

class ConcreteImplementorA implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现A', PHP_EOL;
    }
}

class ConcreteImplementorB implements Implementor
{
    public function OperationImp()
    {
        echo '具体实现B', PHP_EOL;
    }
}
Nach dem Login kopieren

Definieren wir zunächst die Implementierungsschnittstellen und ihre spezifischen Implementierungen, also die Funktionen, die wirklich ausgeführt werden müssen. Es ist wie Adaptee im Adaptermuster.

abstract class Abstraction
{
    protected $imp;
    public function SetImplementor(Implementor $imp)
    {
        $this->imp = $imp;
    }
    abstract public function Operation();
}

class RefinedAbstraction extends Abstraction
{
    public function Operation()
    {
        $this->imp->OperationImp();
    }
}
Nach dem Login kopieren

Definieren Sie die Schnittstelle einer abstrakten Klasse und pflegen Sie einen Verweis auf die Implementierung. In der Implementierungsmethode einer bestimmten abstrakten Klasse rufen wir direkt die reale Operationsmethode auf, die die Schnittstelle implementiert. Ähnlich wie Adapter im Adapter.

$impA = new ConcreteImplementorA();
$impB = new ConcreteImplementorB();

$ra = new RefinedAbstraction();

$ra->SetImplementor($impA);
$ra->Operation();

$ra->SetImplementor($impB);
$ra->Operation();
Nach dem Login kopieren

Beim Aufruf durch den Client kann unsere abstrakte Klasse verschiedene Implementierungsklassen verwenden, um die Operationsmethode polymorph zu machen.

  • In der Erklärung des Quellcodes werden wir feststellen, dass dieser Modus dem Adaptermodus sehr ähnlich ist. Der Zweck eines Adapters besteht jedoch darin, die Zusammenarbeit zweier unabhängiger Klassen zu unterstützen, um zwischenzeitliche Konvertierungsarbeiten durchzuführen. Der Zweck der Überbrückung besteht darin, die Vererbungskopplung des Methodenverhaltens zu entkoppeln, Verhaltensweisen einfach hinzuzufügen, zu ändern und dynamisch aufzurufen, sodass die abstrakten Schnittstellen- und Implementierungsteile unabhängig voneinander geändert werden können. Die Bedeutung besteht darin, die abstrakten Schnittstellen- und Implementierungsteile zuzulassen Die unabhängige Änderung besteht darin, dass die spezifische Implementierungsklasse unserer Implementierungsschnittstelle eine völlig andere Klasse mit unterschiedlichen Funktionen sein und beliebig geändert werden kann, solange der Verweis auf die Implementierungsschnittstelle beibehalten wird. Lassen Sie die Implementierung entscheiden, was es ist.
  • Vorteile des Bridge-Modus: Gemeinsame Nutzung von Schnittstellen und ihren Implementierungsteilen, Verbesserung der Skalierbarkeit und Transparenz der Implementierungsdetails für Kunden
  • Das durch den Bridge-Modus gelöste Hauptproblem ist das enge Kopplungsproblem, das durch das kontinuierliche Wachstum der Vererbung verursacht wird
  • Zusammensetzung und Aggregation: Aggregation ist eine schwache Beziehung, A kann B enthalten, aber B ist nicht Teil von A; Kombination ist eine starke Beziehung, A enthält B, B ist auch ein Teil von A, die Beziehung zwischen dem Ganzen und dem Teil
  • Unsere Mobiltelefone haben unterschiedliche Modelle. Jedes Modell produziert ungefähr das gleiche, aber unterschiedliche Zubehörteile. Zum Beispiel X1-Handyhülle, Film und Kopfhörer; X2-Handyhülle, Film und Kopfhörer usw. Aus Kostengründen werden wir nicht für jedes Mobiltelefonmodell völlig unterschiedliches Zubehör herstellen. Versuchen Sie stattdessen, externes Universalzubehör (Implementor) zu verwenden, damit jedes Mobiltelefonmodell (Abstraction) kombiniert (Bridge) und an Verbraucher verkauft werden kann. So wird verhindert, dass unserer Mobilfunkmarke die Finanzierung ausgeht und wir zu früh schließen müssen. Es scheint, dass es wirklich viele Zusammenhänge zwischen der Führung eines Unternehmens und dem Erlernen von Designmustern gibt! !

Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge.php

Beispiel

Unser SMS-Versand kann auch Bridge to verwenden erreichen. Angenommen, wir haben viele Textnachrichtenvorlagen und verwenden dann verschiedene Textnachrichtenanbieter zum Senden von Textnachrichten. Zu diesem Zeitpunkt können wir den Bridge-Modus verwenden, um verschiedene Kombinationen zu bilden.

SMS-Versandklassendiagramm

Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/18.bridge/source/bridge-message.phpEine kurze Diskussion über den Bridge-Modus in PHP

<?php

interface MessageTemplate
{
    public function GetTemplate();
}

class LoginMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的登录验证码是【AAA】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class RegisterMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的注册验证码是【BBB】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}
class FindPasswordMessage implements MessageTemplate
{
    public function GetTemplate()
    {
        echo &#39;您的找回密码验证码是【CCC】,请不要泄露给他人【XXX公司】!&#39;, PHP_EOL;
    }
}

abstract class MessageService
{
    protected $template;
    public function SetTemplate($template)
    {
        $this->template = $template;
    }
    abstract public function Send();
}

class AliYunService extends MessageService
{
    public function Send()
    {
        echo &#39;阿里云开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

class JiGuangService extends MessageService
{
    public function Send()
    {
        echo &#39;极光开始发送短信:&#39;;
        $this->template->GetTemplate();
    }
}

// 三个短信模板
$loginTemplate = new LoginMessage();
$registerTemplate = new RegisterMessage();
$findPwTemplate = new FindPasswordMessage();

// 两个短信服务商
$aliYun = new AliYunService();
$jg = new JiGuangService();

// 随意组合
// 极光发注册短信
$jg->SetTemplate($registerTemplate);
$jg->Send();

// 阿里云发登录短信
$aliYun->SetTemplate($loginTemplate);
$aliYun->Send();

// 阿里云发找回密码短信
$aliYun->SetTemplate($findPwTemplate);
$aliYun->Send();

// 极光发登录短信
$jg->SetTemplate($loginTemplate);
$jg->Send();

// ......
Nach dem Login kopieren

Erläuterung

Dies ist ein Aggregationsmodus. Vorlagen sind nicht Teil des SMS-Versands. Sie haben keine starke Beziehung. Die Sendemethode des SMS-Absenders muss nicht geändert werden. Sie müssen lediglich verschiedene SMS-Vorlagen übergeben Um ein schnelles Senden verschiedener Vorlagen zu erreichen

Wenn Sie nicht sicher sind, ob es sich tatsächlich um eine Ist-Beziehung handelt, empfiehlt es sich, eine Kombinations-/Aggregationsentwurfsmethode wie den Bridge-Modus zu verwenden, wenn Sie sicher sind, dass die aktuelle Klassenbeziehung vorliegt ist is-a, dann zögern Sie nicht, Vererbung zu verwenden
  • Originaladresse: https://juejin.cn/post/6844903986655395848
  • Autor: Hardcore Project Manager
  • Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über den Bridge-Modus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage