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
- Decorator Pattern - cùng nhóm cấu trúc (bọc để THÊM hành vi, không phải để đổi interface)
- Program to Interface - Tập trung vào trừu tượng - vì sao cả hệ thống nên nói chuyện qua interface
- Open Closed Principle - thay implementation không sửa code cũ