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
Adaptee
và triển khaiTarget
. Nó làm choAdaptee
có thể làm việc vớiClient
. - Adaptee: Đối tượng đã tồn tại, không phù hợp với
Target
.Adapter
giúpClient
sử dụngAdaptee
mộ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:
CheckNumberAdaptee
là đối tượng không phù hợp với interfacePhoneTarget
.Adapter
cho phépCheckNumberAdaptee
làm việc với interfacePhoneTarget
.Client
sử dụngPhoneTarget
để kiểm tra số điện thoại và sử dụngAdapter
để kết nối vớiCheckNumberAdaptee
.