Шаблон проектирования адаптера — это структурный шаблон, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он действует как посредник (или адаптер) между двумя объектами, преобразуя интерфейс одного объекта в интерфейс, ожидаемый другим. Это позволяет классам, которые в противном случае были бы несовместимы, поскольку у них разные интерфейсы, взаимодействовать без изменения их исходного кода.
Структура адаптера
Шаблон адаптера обычно состоит из трех основных элементов:
Типы адаптеров
Когда использовать адаптер?
Этот шаблон полезен в системах, которым необходимо работать с внешними библиотеками или API, позволяя адаптировать их функциональность без изменения кода этих библиотек.
Вот пример использования шаблона проектирования адаптера для интеграции PHPMailer с пользовательским интерфейсом.
Ситуация:
Предположим, что ваша система ожидает, что любой класс отправки электронной почты будет реализовывать интерфейс под названием IMailer, но PHPMailer не следует этому интерфейсу напрямую. Адаптер будет использоваться для адаптации PHPMailer к интерфейсу, ожидаемому системой.
Установить PHPMailer через Composer
composer require phpmailer/phpmailer
Система каталогов
?Adapter ┣ ?src ┃ ┣ ?Interfaces ┃ ┃ ┗ ?IMailer.php ┃ ┣ ?Adapters ┃ ┃ ┗ ?PHPMailerAdapter.php ┃ ┗ ?Services ┃ ┗ ?ServicoDeEmail.php ┣ ?vendor ┣ ?composer.json ┗ ?index.php
Автозагрузка
В файле композитора.json (расположенном в корне проекта) добавьте пространство имен приложения для автоматической загрузки классов:
{ "autoload": { "psr-4": { "App\\": "src/" } }, "require": { "phpmailer/phpmailer": "^6.5" } }
Интерфейс IMailer
namespace App\Interfaces; interface IMailer { public function send($to, $subject, $message); }
Класс 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}"; } }
Класс EmailService
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); }
Файл 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.');
Объяснение структуры
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3