Nói cách đơn giản, Lớp Adaptor sử dụng subclassing và Object Adaptor sử dụng đoàn bằng cách sử dụng thành phần.
Ví dụ:
class MyExistingServiceClass {
public void show() {
System.out.println("Inside Service method show()");
}
}
interface ClientInterface {
void display();
}
class MyNewClassAdapter extends MyExistingServiceClass implements ClientInterface {
void display() {
show();
}
}
Trên đây là một ví dụ về lớp Adapter. Chúng tôi đã điều chỉnh MyExistingServiceClass thành ClientInterface bằng cách gọi phương thức show() hiện có từ bên trong thực hiện display().
Để chuyển đổi này để phản đối bộ chuyển đổi, mã sẽ như thế nào:
class MyNewObjectAdapter implements ClientInterface {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Bây giờ khi sử dụng bộ chuyển đổi đối tượng ở vị trí của lớp Adatper,
Khi không có cách nào để phân lớp lớp học sẽ được điều chỉnh theo giao diện của khách hàng. Ví dụ như, khi MyExistingServiceClass được khai báo là cuối cùng.
Khi khách hàng mong đợi một hợp đồng không phải là inteface mà là triển khai lớp trừu tượng. Trong trường hợp này, chúng ta không có cách nào khác hơn là phân lớp lớp mong đợi của máy khách và vì chúng ta không thể phân lớp nhiều hơn một lớp, không có cách nào khác ngoài việc sử dụng lớp để thích nghi như một thành phần.
abstract class AbstractClientClass {
abstract void display();
}
class MyNewObjectAdapter extends AbstractClientClass {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Khi bạn cần điều chỉnh nhiều đối tượng. Trường hợp như vậy là khi bạn không trực tiếp làm việc với đối tượng để được điều chỉnh. Một ví dụ điển hình ở đây sẽ là lớp JTable trong javax.swing. Lớp này tạo ra một thành phần bảng GUI (giao diện người dùng đồ họa) chứa đầy thông tin mà bộ điều hợp của bạn cung cấp cho nó. Để hiển thị dữ liệu từ miền của bạn, JTable cung cấp các hàm tạo chấp nhận một cá thể của TableModel được định nghĩa trong javax.swing.table. JDK cung cấp một triển khai trừu tượng hiện có của TableModel với AbstractTableModel.
class MyTableModel extends AbstractTableModel {
MyDomainObject[] existingDomainObjects[];
public int getColumnCount() {
return 4;
}
public int getRowCount() {
return existingDomainObjects.length();
}
public MyDomainObject getValueAt(int i) {
return existingDomainObjects[i];
}
}
Ở đây, chúng tôi đã thích nghi MyDomainObject để được sử dụng với AbstractTableModel.