w prostych słowach, Klasa Adapter wykorzystuje Utworzenie podklasy i Adapter używa obiektu delegację stosując kompozycję.
przykład:
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();
}
}
Powyższy przykład klasy adaptera. Adaptowaliśmy MyExistingServiceClass do ClientInterface, wywołując istniejącą metodę show() z poziomu wewnętrznej implementacji display().
Aby przekonwertować to do obiektu adaptera, kod będzie jak:
class MyNewObjectAdapter implements ClientInterface {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Teraz kiedy używać adaptera obiektu w miejsce klasy Adatper,
Kiedy nie ma sposobu, aby podklasy klasa, która zostanie dostosowana zgodnie z interfejsem klienta. Przykłady takie jak, gdy MyExistingServiceClass jest deklarowana jako ostateczna.
Gdy klient oczekuje umowy, która nie jest inteface, ale jest implementacją klasy abstrakcyjnej. W tym przypadku nie mamy innego sposobu, jak podklasy oczekiwanej klasy klienta, a ponieważ nie możemy podklasować więcej niż jednej klasy, nie ma innego sposobu, niż użycie klasy do zaadoptowania jako kompozycji.
abstract class AbstractClientClass {
abstract void display();
}
class MyNewObjectAdapter extends AbstractClientClass {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
Kiedy trzeba dostosować więcej niż jeden obiekt. Taki przypadek występuje wtedy, gdy nie pracujesz bezpośrednio z obiektem, który chcesz zaadaptować. Dobrym przykładem jest klasa JTable w javax.swing. Ta klasa tworzy komponent tabeli GUI (graficzny interfejs użytkownika) wypełniony informacjami, które adapter przekazuje do niego. Aby wyświetlić dane z twojej domeny, JTable dostarcza konstruktorów, które akceptują instancję TableModel zdefiniowaną w javax.swing.table. JDK zapewnia istniejącą, abstrakcyjną implementację TableModel z 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];
}
}
Tutaj przystosowały MyDomainObject w celu użycia z AbstractTableModel.