В простых словах, класса 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();
}
}
Выше приведен пример адаптера класса. Мы адаптировали MyExistingServiceClass к ClientInterface, вызвав существующий метод show() изнутри реализации display().
Для преобразования объекта адаптера, код будет как:
class MyNewObjectAdapter implements ClientInterface {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Теперь, когда использовать адаптер объектов вместо класса 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.