«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Шаблон проектирования PHP: адаптер

Шаблон проектирования PHP: адаптер

Опубликовано 6 ноября 2024 г.
Просматривать:414

Шаблон проектирования адаптера — это структурный шаблон, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он действует как посредник (или адаптер) между двумя объектами, преобразуя интерфейс одного объекта в интерфейс, ожидаемый другим. Это позволяет классам, которые в противном случае были бы несовместимы, поскольку у них разные интерфейсы, взаимодействовать без изменения их исходного кода.

Структура адаптера

Шаблон адаптера обычно состоит из трех основных элементов:

  • Клиент: класс, который будет работать с объектами определенного интерфейса.
  • Адаптируемый: Класс, имеющий интерфейс, несовместимый с клиентом, но функциональные возможности которого необходимы.
  • Адаптер: класс, который реализует интерфейс, ожидаемый клиентом, и преобразует вызовы в интерфейс Adaptee.

PHP Design Pattern: Adapter

Типы адаптеров

  1. Адаптер объекта: на основе композиции. Адаптер содержит экземпляр адаптируемого класса.
  2. Адаптер класса: на основе наследования (обычно в языках, поддерживающих множественное наследование).

Когда использовать адаптер?

  • Когда вы хотите использовать существующий класс, но его интерфейс не соответствует ожиданиям клиента.
  • Чтобы интегрировать новые функции в устаревшую систему без необходимости изменения старого кода.

Этот шаблон полезен в системах, которым необходимо работать с внешними библиотеками или API, позволяя адаптировать их функциональность без изменения кода этих библиотек.

Пример использования PHPMailer

Вот пример использования шаблона проектирования адаптера для интеграции 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;
    }
}
  • Метод sendEmailToClient
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.');

Объяснение структуры

  • IMailer.php: определяет интерфейс IMailer, который должна реализовать любая система электронной почты.
  • PHPMailerAdapter.php: адаптирует PHPMailer к интерфейсу IMailer.
  • EmailService.php: служба электронной почты, использующая интерфейс IMailer для отправки электронных писем.
  • index.php: основной файл, который использует службу электронной почты для отправки сообщения.
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/xxzeroxx/php-design-pattern-adapter-3hi1?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3