Adapter Pattern (Nhóm cấu trúc)

Cho phép các đối tượng với interface KHÔNG TƯƠNG THÍCH làm việc cùng nhau - hoạt động như cầu nối bằng cách chuyển đổi interface của một lớp thành interface mà lớp khác có thể làm việc cùng.

Hiểu nôm na: class Adapter sẽ implement interface A, và triển khai lại phương thức của class B. Khi class cần interface A muốn kết nối tới B, nó chỉ cần gọi Adapter.

Nhóm cấu trúc (Structural Patterns): cách tổ chức các lớp/đối tượng để tạo thành cấu trúc lớn hơn, phức tạp hơn - đảm bảo quan hệ giữa các đối tượng được tổ chức hiệu quả, dễ bảo trì.

🔍 Dấu hiệu nhận biết

Cần chuyển đổi hệ thống, migrate dữ liệu giữa các module khác nhau - Adapter đóng vai trò cây cầu nối đảm bảo việc chuyển đổi trơn tru, không gặp sự cố bất thường.

Ví dụ: chuyển hệ thống gửi email sang AWS SES

<?php
interface EmailServiceInterface {
    public function sendEmail($to, $subject, $message);
}
 
// Class đang chạy (hệ thống cũ)
class EmailService implements EmailServiceInterface {
    public function sendEmail($to, $subject, $message) {
        echo "Đã gửi email đến $to với chủ đề: $subject và nội dung: $message";
    }
}
 
// Class mới, HÀNH VI KHÁC hệ thống cũ (dùng AWS SES)
class SendEmailAWS {
    public function send($email) {
        echo "Đã gửi email thông qua AWS SES";
    }
}
 
// Adapter: implement interface cũ, dịch lời gọi sang class mới
class AWSAdapter implements EmailServiceInterface {
    private $awsService;
 
    public function __construct(SendEmailAWS $awsService) {
        $this->awsService = $awsService;
    }
 
    public function sendEmail($to, $subject, $message) {
        // Chuyển đổi từ giao diện hiện có sang giao diện của AWS
        $email = ['to' => $to, 'subject' => $subject, 'message' => $message];
        $this->awsService->send($email);
    }
}
 
// Dùng EmailService nhưng bên dưới gửi qua AWS
$emailService = new AWSAdapter(new SendEmailAWS());
$emailService->sendEmail('[email protected]', 'Chủ đề', 'Nội dung');

Có thể thay $emailService khởi tạo từ Adapter vào bất cứ chỗ nào đang dùng code cũ mà không làm break hệ thống.

Liên quan