Адаптер, Адаптер, адаптер ~ На самом деле шаблон дизайна адаптера можно рассматривать как простую программу/класс преобразования. Обычно он используется для создания двух несовместимых интерфейсов или классов для совместной работы. Пожалуйста, ознакомьтесь с приведенным ниже рисунком дизайна адаптера, нарисованным мной, немного уродливым 🙂
тематическое исследование
Компания A разработала программу на Java для отображения всех деталей продуктов в консоли. Эта программа Java очень проста, и она берет коллекцию итераторов и повторяет ее для отображения продукта один за другим.
Однако компания A передала внутреннюю систему продукта на аутсорсинг поставщику, называемому поставщиком B. Поставщик B выпустил систему, которая вернет все продукты в виде коллекции перечислений.
Арг… подожди… возвращать товар как перечисление? Но текущая система компании A предназначена для принятия продукта в качестве итератора. Дизайн компании A полностью основан на функционировании коллекции итераторов, теперь поставщик B предоставляет старую и устаревшую функцию (перечисление), что нам делать?
Вышеприведенные сценарии звучат одинаково для всех, верно? Да, это всегда случалось и со мной. Так.. кто собирается это изменить? Честно говоря, я могу гарантировать, что поставщик B на 100 % не изменит его для вас.
Однако компания А также не может позволить себе перепроектировать его, потому что она уже вложила так много времени и трудовых ресурсов.
Вот адаптер встал на место. Что нам нужно сделать, так это создать класс адаптера, который может преобразовывать перечисление в итератор. Понимаешь? Изучение приведенного ниже кода может иметь для вас смысл.
Изучение кода
Это класс “Перечисляемый продукт”, предоставляемый поставщиком, он возвращает продукт в виде перечисления, вызывая функцию getProduct ().
package com.mkyong.adapter; import java.util.Enumeration; import java.util.Vector; public class EnumProduct { private Vector product; public EnumProduct(){ product = new Vector(); setProduct("ProductA"); setProduct("ProductB"); setProduct("ProductC"); } public void setProduct(String s){ product.add(s); } public Enumeration getProduct(){ EnumerationeProduct = product.elements(); return eProduct; } }
Вот программа “Продукт”, которая используется для отображения всех продуктов на экране консоли.
package com.mkyong.adapter; import java.util.Enumeration; import java.util.Vector; import java.util.Iterator; public class Product { //cant change here for some reason public void displayProduct(Iterator iterator){ for (; iterator.hasNext();) System.out.println(iterator.next()); } public static void main(String[] args) { Product product = new Product(); //product.displayProduct(); //display it } }
Компания A использует функцию отображения продукта (Итератор итератора) для отображения всей информации о продуктах в консоли. Компания А не хочет меняться и настаивает на том, чтобы принять итератор в качестве параметра.
Здесь шаблон проектирования адаптера может заставить его работать без каких-либо изменений, связанных с текущей системой и классом поставщика, а также , что компании нужно сделать, это создать класс адаптера для преобразования перечисления в итератор, как показано ниже
package com.mkyong.adapter; import java.util.Iterator; import java.util.Enumeration; public class EnumToIteratorAdapter implements Iterator { Enumeration enumA; public EnumToIteratorAdapter(Enumeration e){ enumA = e; } public boolean hasNext(){ return enumA.hasMoreElements(); } public Object next(){ return enumA.nextElement(); } public void remove(){ throw new UnsupportedOperationException(); } }
Хорошо, теперь вернитесь к классу “Продукт” компании, теперь он может принимать перечисление!!!
package com.mkyong.adapter; import java.util.Enumeration; import java.util.Vector; import java.util.Iterator; public class Product { public void displayProduct(Iterator iterator){ for (; iterator.hasNext();) System.out.println(iterator.next()); } public static void main(String[] args) { Product product = new Product(); EnumProduct enumProduct = new EnumProduct(); EnumToIteratorAdapter enumToIteratorAdapter = new EnumToIteratorAdapter(enumProduct.getProduct()); product.displayProduct(enumToIteratorAdapter); } }
Мы ничего не изменили ни в классе продукта, ни в классе перечисления продуктов. Мы просто создаем новый класс адаптера для преобразования перечисления в класс итератора. Сделано.
Оригинал: “https://mkyong.com/design-pattern/adapter-design-pattern/”