Adapter Pattern là gì
Adapter Pattern là một mẫu design pattern trong lập trình.
Mục đích của Adapter Pattern là cho phép các interface không liên quan tới nhau có thể làm việc cùng nhau. Điều này thường xảy ra khi bạn muốn sử dụng một lớp đã tồn tại mà không phù hợp với giao diện (interface) của bạn. Đối tượng giúp kết nối các interface này gọi là Adapter.
Ví dụ trong cuộc sống: Hãy tưởng tượng bạn có một ổ cắm điện có 3 chân, nhưng ở nhà bạn chỉ có ổ cắm có 2 lỗ. Để kết nối được, bạn cần sử dụng một bộ chuyển đổi (adapter) để chuyển từ 3 chân thành 2 chân.
Adapter Pattern UML Diagram
UML Diagram của Adapter Pattern cho thấy mối quan hệ giữa các thành phần chính:
- Client: Đối tượng sử dụng interface
Target. - Target: Interface mà Client mong muốn sử dụng.
- Adapter: Lớp này kế thừa hoặc sử dụng
Adapteevà triển khaiTarget. Nó làm choAdapteecó thể làm việc vớiClient. - Adaptee: Đối tượng đã tồn tại, không phù hợp với
Target.AdaptergiúpClientsử dụngAdapteemột cách thuận tiện.
Ví dụ về Adapter Pattern
Giả sử bạn có một lớp CheckNumberAdaptee thực hiện kiểm tra chuỗi ký tự có phải là kiểu số không. Bạn muốn kiểm tra xem một chuỗi có phải là số điện thoại (có từ 10 đến 11 chữ số) hay không bằng cách sử dụng CheckNumberAdaptee. Để làm điều này, bạn sẽ sử dụng một lớp Adapter để triển khai interface PhoneTarget và sử dụng CheckNumberAdaptee để thực hiện kiểm tra số điện thoại.
Dưới đây là ví dụ code trong Java:
java
public class CheckNumberAdaptee {
public boolean checkNumber(String input) {
String regex = "[0-9]+";
return input.matches(regex);
}
}
public interface PhoneTarget {
boolean checkPhoneNumber(String input);
}
public class Adapter implements PhoneTarget {
CheckNumberAdaptee checkNumberAdaptee = new CheckNumberAdaptee();
@Override
public boolean checkPhoneNumber(String input) {
if (!checkNumberAdaptee.checkNumber(input)) {
return false;
}
if (input.length() > 11 || input.length() < 10) {
return false;
}
return true;
}
}
public class Client {
public static void main(String[] args) {
PhoneTarget phoneTarget = new Adapter();
String input1 = "abcd";
String input2 = "123";
String input3 = "01234342342";
System.out.println(input1 + " is phone number: " + phoneTarget.checkPhoneNumber(input1));
System.out.println(input2 + " is phone number: " + phoneTarget.checkPhoneNumber(input2));
System.out.println(input3 + " is phone number: " + phoneTarget.checkPhoneNumber(input3));
}
}
Kết quả
abcd is phone number: false
123 is phone number: false
01234342342 is phone number: true
Trong ví dụ này:
CheckNumberAdapteelà đối tượng không phù hợp với interfacePhoneTarget.Adaptercho phépCheckNumberAdapteelàm việc với interfacePhoneTarget.Clientsử dụngPhoneTargetđể kiểm tra số điện thoại và sử dụngAdapterđể kết nối vớiCheckNumberAdaptee.