El Patrón de diseño del adaptador es un patrón estructural que permite que objetos con interfaces incompatibles trabajen juntos. Actúa como intermediario (o adaptador) entre dos objetos, convirtiendo la interfaz de un objeto en la interfaz esperada por el otro. Esto permite que clases que de otro modo serían incompatibles porque tienen diferentes interfaces cooperen sin modificaciones en su código original.
Estructura del adaptador
El patrón Adaptador generalmente se compone de tres elementos principales:
Tipos de adaptadores
¿Cuándo utilizar el adaptador?
Este patrón es útil en sistemas que necesitan trabajar con bibliotecas o API externas, permitiéndole adaptar su funcionalidad sin cambiar el código de estas bibliotecas.
Aquí hay un ejemplo de cómo utilizar el patrón de diseño del adaptador para integrar PHPMailer con una interfaz personalizada.
Situación:
Supongamos que su sistema espera que cualquier clase de envío de correo electrónico implemente una interfaz llamada IMailer, pero PHPMailer no sigue esta interfaz directamente. El Adaptador se utilizará para adaptar PHPMailer a la interfaz esperada por el sistema.
Instalar PHPMailer a través de Composer
composer require phpmailer/phpmailer
Sistema de directorio
?Adapter ┣ ?src ┃ ┣ ?Interfaces ┃ ┃ ┗ ?IMailer.php ┃ ┣ ?Adapters ┃ ┃ ┗ ?PHPMailerAdapter.php ┃ ┗ ?Services ┃ ┗ ?ServicoDeEmail.php ┣ ?vendor ┣ ?composer.json ┗ ?index.php
Carga automática
En el archivo compositor.json (ubicado en la raíz del proyecto), agregue el espacio de nombres de la aplicación para cargar automáticamente las clases:
{ "autoload": { "psr-4": { "App\\": "src/" } }, "require": { "phpmailer/phpmailer": "^6.5" } }
Interfaz de correo electrónico
namespace App\Interfaces; interface IMailer { public function send($to, $subject, $message); }
Clase PHPMailerAdapter
namespace App\Adapters; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use App\Interfaces\IMailer; class PHPMailerAdapter implements IMailer { private $phpMailer; public function __construct() { $this->phpMailer = new PHPMailer(true); // Basic PHPMailer configuration $this->phpMailer->isSMTP(); $this->phpMailer->Host = 'smtp.example.com'; $this->phpMailer->SMTPAuth = true; $this->phpMailer->Username = '[email protected]'; $this->phpMailer->Password = 'password'; $this->phpMailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $this->phpMailer->Port = 587; $this->phpMailer->setFrom('[email protected]', 'Your Name'); } }
public function send($to, $subject, $message) { try { $this->phpMailer->addAddress($to); $this->phpMailer->Subject = $subject; $this->phpMailer->Body = $message; $this->phpMailer->send(); echo 'Email sent successfully!'; } catch (Exception $e) { echo "Failed to send email: {$this->phpMailer->ErrorInfo}"; } }
Servicio de correo electrónico de clase
namespace App\Services; use App\Interfaces\IMailer; class EmailService { private $mailer; public function __construct(IMailer $mailer) { $this->mailer = $mailer; } }
public function sendEmailToClient($to, $subject, $message) { $this->mailer->send($to, $subject, $message); }
Archivo index.php
require 'vendor/autoload.php'; use App\Adapters\PHPMailerAdapter; use App\Services\EmailService; // Creating the PHPMailer Adapter $mailer = new PHPMailerAdapter(); // Using the email service with the IMailer interface $emailService = new EmailService($mailer); // Sending an email $emailService->sendEmailToClient('[email protected]', 'Email Subject', 'Message content.');
Explicación de la Estructura
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3