어댑터 디자인 패턴은 호환되지 않는 인터페이스를 가진 개체가 함께 작동할 수 있도록 하는 구조적 패턴입니다. 두 개체 사이의 중개자(또는 어댑터) 역할을 하여 한 개체의 인터페이스를 다른 개체가 예상하는 인터페이스로 변환합니다. 이를 통해 원래 코드를 수정하지 않고도 서로 다른 인터페이스를 가지기 때문에 호환되지 않는 클래스가 협력할 수 있습니다.
어댑터 구조
어댑터 패턴은 일반적으로 세 가지 주요 요소로 구성됩니다.
어댑터 유형
어댑터는 언제 사용합니까?
이 패턴은 외부 라이브러리나 API와 함께 작동해야 하는 시스템에 유용하며, 이러한 라이브러리의 코드를 변경하지 않고도 해당 기능을 조정할 수 있습니다.
다음은 어댑터 디자인 패턴을 사용하여 PHPMailer를 사용자 정의 인터페이스와 통합하는 방법의 예입니다.
상황:
시스템에서 이메일 전송 클래스가 IMailer라는 인터페이스를 구현하기를 기대하지만 PHPMailer는 이 인터페이스를 직접 따르지 않는다고 가정해 보겠습니다. 어댑터는 시스템에서 예상하는 인터페이스에 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 = '[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}"; } }
수업 이메일 서비스
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