首頁 >後端開發 >php教程 >PHP 設計模式:轉接器

PHP 設計模式:轉接器

Susan Sarandon
Susan Sarandon原創
2024-10-27 08:59:30485瀏覽

適配器設計模式是一種結構模式,允許具有不相容介面的物件一起工作。它充當兩個物件之間的中介(或適配​​器),將一個物件的介面轉換為另一個物件期望的介面。這使得那些因為具有不同介面而不相容的類別可以在不修改其原始程式碼的情況下進行協作。

適配器結構

適配器模式一般由三個主要元素組成:

  • 客戶端:期望與特定介面的物件一起工作的類別。
  • Adaptee:具有與客戶端不相容的接口,但其功能是必需的類別。
  • Adapter:實作客戶端期望的介面的類,並將呼叫轉換為Adaptee介面。

PHP Design Pattern: Adapter

適配器類型

  1. 物件適配器:基於組合。適配器包含它正在適應的類別的實例。
  2. 類別適配器:基於繼承(通常在支援多重繼承的語言中)。

何時使用適配器?

  • 當你想使用現有的類別,但它的介面與客戶端期望的不符時。
  • 將新功能整合到遺留系統中,而無需修改舊程式碼。

此模式在需要使用外部程式庫或 API 的系統中非常有用,讓您在不更改這些程式庫的程式碼的情況下調整其功能。

使用 PHPMailer 的範例

這裡是如何使用適配器設計模式將 PHPMailer 與自訂介面整合的範例。

情況:

假設您的系統期望任何電子郵件發送類別實現一個名為 IMailer 的接口,但 PHPMailer 並不直接遵循此接口。 Adapter將用於使PHPMailer適應系統期望的介面。

透過 Composer 安裝 PHPMailer

composer require phpmailer/phpmailer

目錄系統

?Adapter
 ┣ ?src
 ┃ ┣ ?Interfaces
 ┃ ┃ ┗ ?IMailer.php
 ┃ ┣ ?Adapters
 ┃ ┃ ┗ ?PHPMailerAdapter.php
 ┃ ┗ ?Services
 ┃   ┗ ?ServicoDeEmail.php
 ┣ ?vendor
 ┣ ?composer.json
 ┗ ?index.php

自動載入

在composer.json檔案(位於專案根目錄)中,新增App命名空間以自動載入類別:

{
    "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 = 'your-email@example.com';
        $this->phpMailer->Password = 'password';
        $this->phpMailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $this->phpMailer->Port = 587;
        $this->phpMailer->setFrom('your-email@example.com', '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}";
    }
}

類電子郵件服務

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

composer require phpmailer/phpmailer

結構說明

  • IMailer.php:定義任何電子郵件系統都應該實作的 IMailer 介面。
  • PHPMailerAdapter.php:將 PHPMailer 適配為 IMailer 介面。
  • EmailService.php:使用IMailer介面傳送電子郵件的電子郵件服務。
  • index.php:使用電子郵件服務傳送訊息的主文件。

以上是PHP 設計模式:轉接器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn