Maison  >  Article  >  développement back-end  >  Découvrez le modèle d'adaptateur en PHP dans un article

Découvrez le modèle d'adaptateur en PHP dans un article

青灯夜游
青灯夜游avant
2021-06-29 19:12:473490parcourir

Dans l'article précédent " Une brève discussion sur le mode décorateur en PHP " nous avons présenté le mode décorateur en PHP. Cet article vous amènera à comprendre le mode adaptateur en PHP.

Découvrez le modèle d'adaptateur en PHP dans un article

Ce modèle a toujours eu un exemplaire très classique, et c'est la prise ! C'est vrai, lorsque nous achetons des appareils électriques à l'étranger ou que nous voyageons à l'étranger pour affaires, nous avons souvent besoin d'un adaptateur secteur, car la norme de tension de notre pays est de 220 volts, alors que d'autres pays ont des normes de 110 volts. Et cet adaptateur secteur est un symbole du mode adaptateur. Lorsque l'objet ne répond pas aux exigences, ajoutez-y un adaptateur ! !

Diagramme et explication de la classe Gof

Définition GoF : Convertissez l'interface d'une classe en une autre interface souhaitée par le client. Le modèle Adaptateur permet aux classes qui ne pouvaient pas fonctionner ensemble à l'origine en raison d'interfaces incompatibles de travailler ensemble

Diagramme de classes GoF :

Héritage

Découvrez le modèle dadaptateur en PHP dans un article

Combiné

Découvrez le modèle dadaptateur en PHP dans un article

Implémentation de code

interface Target{
    function Request() : void;
}

Définir un contrat d'interface, Il peut être également une classe normale avec des méthodes d'implémentation (nous utiliserons des classes dans les exemples suivants)

class Adapter implements Target{
    private $adaptee;

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

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

L'adaptateur implémente ce contrat d'interface afin que la méthode Request() puisse être implémentée, mais veuillez noter que ce que nous appelons en réalité C'est une méthode de la classe Adaptee

class Adaptee {
    function SpecificRequest() : void{
        echo "I'm China Standard!";
    }
}
  • Il existe deux formes d'adaptateurs. Le diagramme de classes ci-dessus est donné. La forme de combinaison de la forme d'héritage
  • implémentée par notre code est. dans le livre GoF, C++ est utilisé comme exemple, car C++ peut implémenter l'héritage multiple, mais la plupart des langages populaires se présentent sous la forme d'interfaces, qui peuvent également être implémentées, mais il n'y a pas beaucoup d'adaptateurs qui l'utilisent. form
  • En fait, il est toujours orienté vers Une sorte de réflexion dans la programmation d'interface est similaire au packaging d'anciennes fonctions par les décorateurs. Ici, nous les remplaçons directement, mais les appels externes restent les mêmes
  • <.>Le modèle de l'adaptateur est en fait facile à comprendre, et le code est vraiment tout.

Parlons encore de mon usine de téléphones portables. Cette fois, notre activité s'est vraiment développée ! Il a été vendu en Thaïlande, à Singapour et en Indonésie. Quoi qu'il en soit, on le trouve partout où il y a du curry. On dit que nous avons produit une couleur curry. Le changement de coque n'est pas entièrement dû à l'influence de Noé, mais après de longues recherches, nous avons constaté que différentes couleurs se vendent mieux à différents endroits. Par conséquent, Foxconn a installé un adaptateur de pulvérisation (adaptateur) pour nous sur la ligne de production d'étuis de téléphone portable d'origine (Target). Lorsque nous avons besoin d'étuis d'autres couleurs, nous n'avons besoin que de cet adaptateur pour changer différentes peintures (adapté), installez directement ce pulvérisateur, et un nouveau téléphone mobile couleur est né. Lors de l'expansion de notre activité dans un autre pays, il nous suffit de changer la peinture. Si cela prend trop de temps, nous remplacerons également la buse (rappelez-vous l'approvisionnement continu des imprimantes)

Code complet. :Modèle d'adaptateur

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

Exemple

Continuez à envoyer des messages texte et voyez quand je pourrai le compiler~~~

Tout le monde utilise souvent le SDK fourni par ces plateformes lors de la connexion aux interfaces d'information et de paiement. Surtout avec Composer, il est plus pratique d'installer le SDK. Cependant, il existe un autre problème sérieux. Bien que les SDK créés par ces personnes aient des fonctions similaires, leurs noms sont très différents ! ! Notre système a toujours utilisé les services d'Alibaba Cloud, mais cette fois, nous devons ajouter les fonctions d'information de Jiguang et Baidu Cloud, d'une part comme sauvegarde, et d'autre part, pour utiliser différentes interfaces selon différents services à des fins de sécurité ou de sauvegarde. de toute façon ? Que diriez-vous d'unifier leurs interfaces externes afin que lorsque nous utilisons leur SDK, cela puisse être très pratique et identique à l'interface Alibaba Cloud à laquelle tout le monde est déjà habitué ? Bien sûr, donnez-leur simplement un adaptateur à chacun. Lors de l'instanciation, vous pouvez simplement configurer une usine externe pour renvoyer différents adaptateurs. Tant que la méthode d'implémentation dans l'adaptateur est la même que celle d'Alibaba Cloud, tout ira bien !

Diagramme des classes d'envoi de SMS

Découvrez le modèle dadaptateur en PHP dans un article

Code source complet : méthode d'adaptateur d'envoi de SMS

https : / /github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter-message.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();

Description :

  • Dans cet exemple, nous avons deux adaptateurs car il y a deux SDK que nous devons adapter. Qui a dit qu'il ne pouvait y avoir qu'un seul convertisseur de puissance, et si un pays magique utilisait du 500 volts, il vaut donc mieux apporter ? un convertisseur de puissance supplémentaire
  • Ici, nous héritons de la classe Message, car la classe Message est du code qui a été écrit auparavant, et il peut y avoir des méthodes publiques dedans, donc il n'y a pas d'interface abstraite. Vous pouvez envisager d'extraire une interface abstraite lors de la refactorisation du code, mais ici, il s'agit simplement de démontrer que l'adaptateur peut non seulement cibler l'interface, tant qu'elle est cohérente avec l'objet d'origine, il est acceptable de ne rien hériter. . Après tout, nous sommes un langage faiblement typé, s'il s'agit d'un type fort similaire à Java, alors l'héritage ou l'implémentation est toujours nécessaire (polymorphisme)
  • Les adaptateurs combinés sont similaires aux décorateurs dans le sens où ils maintiennent un externe. objet, et les décorateurs ont plus Les méthodes de la classe d'origine seront utilisées pour ajouter des fonctions, tandis que l'adaptateur ajoute rarement des fonctions. Au lieu de cela, il remplace directement le module Filesystem dans
  • Laravel. pensez Il n'y a rien de plus à dire. Il est évident pour tout le monde que nous utilisons le modèle d'adaptateur, alors étudiez-le attentivement
  • Lorsque vous souhaitez utiliser une classe, mais que le contenu qu'elle propose ne correspond pas à votre activité. vous souhaitez créer une classe qui peut fonctionner avec d'autres classes non liées ou des classes imprévues, vous pouvez aussi bien essayer le modèle d'adaptateur

Apprentissage recommandé : "Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer