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.
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 ! !
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
Combiné
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!"; } }
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'adaptateurhttps://github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter.php
Diagramme des classes d'envoi de SMS
Code source complet : méthode d'adaptateur d'envoi de SMShttps : / /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();Copier après la connexionDescription :
- 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!