Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.
Визначення
Патерн адаптер(Adapter) або ж обгортка (Wrapper) використовується для трансляції інтерфейсу одного класу в інтерфейс іншого. Це означає, що ми можемо зробити так, щоб класи працювали разом, хоча вони мають несумісні інтерфейси. Клас адаптер використовує множинне успадкування (розширяючи один клас і/або реалізуючи один або більше класів), щоб адаптувати один інтерфейс до іншого. Об’єкт адаптер покладається на агрегацію об’єктів.
Де використовується
Переваги
На діаграмі вище:
Уявімо вам необхідно розробити простий файловий менеджер для обробки техстових документів. Наявний існуючий ресурс, що вже обробляє їх і по деяким причинам ви змушені використовувати визначений інтерфейс для вашого файлового менеджера. Використовуючи клас адаптер ми можемо використати інтерфейс, що вимагається, із збереженням існуючої функціональності. На діаграмі класів нижче інтерфейс FileManager є цільовим (бажаним інтерфейсом). FileManagerUtil – це існуючий клас, який потрібно використати і який ми б хотіли адаптувати до інтерфейсу FilManager. Адаптацію здійснюємо в класі FileManagerImpl. Цей клас застосовує бажаний інтерфейс і існуючу функціональність через успадкування і є класом адаптером.
c:>Opening file: dummyfile.dat
c:>Writing 8 chars from string: dynamite to pos: 0 in file
c:>Reading 8 chars from pos: 0 in fileData written and read: dynamite
c:>Closing file
Приклади застосування:
В Java API застосовується патерн адаптер у WindowAdapter, ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter.
Визначення
Патерн адаптер(Adapter) або ж обгортка (Wrapper) використовується для трансляції інтерфейсу одного класу в інтерфейс іншого. Це означає, що ми можемо зробити так, щоб класи працювали разом, хоча вони мають несумісні інтерфейси. Клас адаптер використовує множинне успадкування (розширяючи один клас і/або реалізуючи один або більше класів), щоб адаптувати один інтерфейс до іншого. Об’єкт адаптер покладається на агрегацію об’єктів.
Де використовується
- Коли ви хочети використовувати існуючий клас, але його інтерфейс не зіставляється з тим який вам потрібен
- Коли ви хочете створити повторно використовуваний клас, що взаємодії з непов’язаними або невідомими наперед класами, що є класами, що необов’язково мають сумісний інтерфейс.
- Коли ви хочете збільшити прозорість класів
- Коли ви хочете створити вбудовуваний набір.
Переваги
- Висока повторна використовуваність класів
- Вводиться лише один клас
- При використанні Java, об’єкт ціль (Target) має бути інтерфейсом.
На діаграмі вище:
- Клас Client очікує певний інтерфейс (що зветься цільовим інтерфейсом (Target interface))
- Наявний інтерфейс класу не співпадає з інтерфейсом Target
- Клас Adapter долає неспівпадіння між інтерфейсом Target та наявним інтерфейсом
- Наявний інтерфейс названо Adaptee
Уявімо вам необхідно розробити простий файловий менеджер для обробки техстових документів. Наявний існуючий ресурс, що вже обробляє їх і по деяким причинам ви змушені використовувати визначений інтерфейс для вашого файлового менеджера. Використовуючи клас адаптер ми можемо використати інтерфейс, що вимагається, із збереженням існуючої функціональності. На діаграмі класів нижче інтерфейс FileManager є цільовим (бажаним інтерфейсом). FileManagerUtil – це існуючий клас, який потрібно використати і який ми б хотіли адаптувати до інтерфейсу FilManager. Адаптацію здійснюємо в класі FileManagerImpl. Цей клас застосовує бажаний інтерфейс і існуючу функціональність через успадкування і є класом адаптером.
public interface FileManager { public String open(String s); public String close(); public String read(int pos, int amount, byte[] data); public String write(int pos, int amount, byte[] data); } import java.util.*; import java.io.*; public class FileManagerUtil { private RandomAccessFile f; public boolean openFile(String fileName) { System.out.println("Opening file: " + fileName); boolean success = true; return success; } public boolean closeFile() { System.out.println("Closing file"); boolean success = true; return success; } public boolean writeToFile(String d, long pos, long amount) { System.out.print("Writing " + amount + " chars from string: " + d); System.out.println(" to pos: " + pos + " in file"); boolean success = true; return success; } public String readFromFile(long pos, long amount) { System.out.print("Reading " + amount + " chars from pos: " + pos + " in file"); return new String("dynamite"); } } public class FileManagerImpl extends FileManagerUtil implements FileManager { public String close() { return new Boolean(closeFile()).toString(); } public String open(String s) { return new Boolean(openFile(s)).toString(); } public String read(int pos, int amount, byte[] data) { return readFromFile(pos, amount); } public String write(int pos, int amount, byte[] data) { boolean tmp = writeToFile(new String(data), pos, amount); return String.valueOf(tmp); } } public class FileManagerClient { public static void main(String[] args) { FileManager f = null; String dummyData = "dynamite"; f = new FileManagerImpl(); System.out.println("Using filemanager: " + f.getClass().toString()); f.open("dummyfile.dat"); f.write(0, dummyData.length(), dummyData.getBytes()); String test = f.read(0, dummyData.length(), dummyData.getBytes()); System.out.println("Data written and read: " + test); f.close(); } }При застосуванні FileManagerClient результатом буде:
c:>Opening file: dummyfile.dat
c:>Writing 8 chars from string: dynamite to pos: 0 in file
c:>Reading 8 chars from pos: 0 in fileData written and read: dynamite
c:>Closing file
Приклади застосування:
В Java API застосовується патерн адаптер у WindowAdapter, ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter.
Немає коментарів:
Дописати коментар