Adapter Pattern là một trong các mẫu thiết kế thuộc nhóm Structural Patterns (mẫu cấu trúc). Nó cho phép các đối tượng có giao diện không tương thích làm việc với nhau bằng cách cung cấp một lớp trung gian để chuyển đổi giao diện của đối tượng này thành giao diện mà đối tượng khác mong đợi.
Adapter Pattern được sử dụng khi bạn muốn tích hợp một lớp hiện có vào một hệ thống, nhưng lớp đó có giao diện khác với những gì hệ thống yêu cầu. Thay vì thay đổi lớp hiện có (có thể là không khả thi nếu lớp thuộc thư viện bên ngoài hoặc đã được triển khai từ lâu), bạn có thể tạo ra một lớp Adapter để làm “cầu nối” giữa hệ thống và lớp không tương thích.
Adapter Pattern hoạt động bằng cách tạo ra một lớp Adapter có nhiệm vụ chuyển đổi các phương thức và thuộc tính của lớp không tương thích thành giao diện mà hệ thống mong đợi. Lớp này sẽ triển khai giao diện hoặc kế thừa từ một lớp mà hệ thống sử dụng, và bên trong nó, sẽ chuyển tiếp các lời gọi phương thức đến đối tượng gốc với giao diện không tương thích.
Giả sử chúng ta có hai lớp, một lớp mới đang sử dụng giao diện USB để sạc thiết bị, và một lớp cũ sử dụng giao diện MicroUSB. Hệ thống mới của bạn yêu cầu sử dụng USB, nhưng bạn lại có một thiết bị cũ chỉ hỗ trợ MicroUSB. Ở đây, chúng ta sẽ sử dụng Adapter Pattern để kết nối hệ thống với thiết bị cũ mà không cần phải thay đổi thiết bị đó.
public interface USB { void connectWithUsbCable(); }
public class MicroUSBDevice { public void connectWithMicroUsbCable() { System.out.println("Connected with Micro USB cable"); } }
public class MicroUsbToUsbAdapter implements USB { private MicroUSBDevice microUSBDevice; public MicroUsbToUsbAdapter(MicroUSBDevice microUSBDevice) { this.microUSBDevice = microUSBDevice; } @Override public void connectWithUsbCable() { // Chuyển lời gọi phương thức USB thành lời gọi phương thức MicroUSB microUSBDevice.connectWithMicroUsbCable(); } }
public class Main { public static void main(String[] args) { // Tạo một thiết bị sử dụng MicroUSB MicroUSBDevice microUsbDevice = new MicroUSBDevice(); // Tạo Adapter để chuyển đổi từ MicroUSB sang USB USB adapter = new MicroUsbToUsbAdapter(microUsbDevice); // Sử dụng giao diện USB để kết nối với thiết bị MicroUSB adapter.connectWithUsbCable(); } }
Connected with Micro USB cable
Trong ví dụ trên, lớp MicroUsbToUsbAdapter đã chuyển đổi giao diện USB thành giao diện MicroUSB, giúp hệ thống có thể sử dụng được thiết bị cũ mà không cần phải thay đổi gì trong lớp MicroUSBDevice.
Adapter Pattern có thể được chia thành hai loại:
Adapter Pattern là một giải pháp hữu ích để tích hợp các lớp không tương thích với hệ thống mà không cần phải thay đổi lớp gốc. Nó giúp giữ mã nguồn dễ hiểu, tái sử dụng, và dễ bảo trì. Đây là một mẫu thiết kế lý tưởng trong các trường hợp bạn phải làm việc với các hệ thống hoặc thư viện cũ mà không thể chỉnh sửa chúng.