Проще говоря,
Class Adapter использует подклассы, а Object Adapter использует делегирование с использованием композиции.
Пример:
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();
}
}
Выше приведен пример Class Class Adapter. Мы адаптировали MyExistingServiceClass к ClientInterface, вызвав существующий метод show () изнутри реализации display ().
Чтобы преобразовать это в объектный адаптер, код будет выглядеть так:
class MyNewObjectAdapter implements ClientInterface {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Теперь, когда использовать Object адаптер вместо Class Adatper,
Когда нет способа подкласса класса, который будет адаптирован в соответствии с интерфейсом клиента. Например, когда MyExistingServiceClass объявлен как окончательный.
Когда клиент ожидает контракт, который является не интерфейсом, а реализацией абстрактного класса. В этом случае у нас нет другого способа, кроме как создать подкласс ожидаемого класса клиента, и, поскольку мы не можем создать подкласс более чем одного класса, нет другого способа, кроме как использовать этот класс для адаптации в качестве композиции.
abstract class AbstractClientClass {
abstract void display();
}
class MyNewObjectAdapter extends AbstractClientClass {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Когда вам нужно адаптировать более одного объекта. Это тот случай, когда вы не работаете напрямую с объектом, который нужно адаптировать. Хорошим примером здесь будет класс JTable в javax.swing. Этот класс создает компонент таблицы GUI (графический интерфейс пользователя), заполненный информацией, которую ваш адаптер передает ему. Для отображения данных из вашего домена JTable предоставляет конструкторы, которые принимают экземпляр TableModel
определено в javax.swing.table. JDK предоставляет существующую абстрактную реализацию TableModel с 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];
}
}
Здесь мы адаптировали MyDomainObject для использования с AbstractTableModel.