Адаптер, адаптер, адаптер ~ На самом деле шаблон проектирования адаптера можно рассматривать как простую программу преобразования/класс. Обычно он используется для создания двух несовместимых интерфейсов или классов для совместной работы. Пожалуйста, ознакомьтесь ниже Адаптер дизайн рисунка изображения, нарисованного мной, немного некрасиво :)
ссылка://wp-content/uploads/2008/09/adapter-graphic.bmp[Изображение://wp-content/uploads/2008/09/adapter-graphic.bmp[изображение, название = "Адаптер-график"]]
[.underline]##
Case Study
+ Компания А разработала программу на Java для отображения всех деталей продуктов в консоли. Эта Java-программа очень проста, и она берет коллекцию Iterator и повторяет ее для отображения продукта один за другим.
Тем не менее, компания А передала свою внутреннюю систему Продукта поставщику под названием Поставщик B. Поставщик B выпустил систему, которая будет возвращать все продукты в качестве коллекции Enumeration.
Arg … подождите … вернуть товар как перечисление? Но текущая система компании А предназначена для принятия продукта в качестве итератора. Дизайн компании A основан на функционировании коллекции Iterator, теперь поставщик B предоставляет старую и устаревшую функцию (перечисление), что нам делать?
Выше сценарии звучат похоже на всех, верно? Да, это всегда случалось и со мной. Итак … кто собирается это изменить? Честно говоря, я могу гарантировать, что поставщик B на 100% не изменит его для вас.
Однако компания А также не может позволить себе изменить ее дизайн, потому что она уже потратила столько времени и сил.
Здесь адаптер на месте. Что нам нужно сделать, это создать класс адаптера, который может преобразовывать перечисление в итератор. Понимаю? Изучение приведенного ниже кода может иметь смысл для вас.
[.underline]##
Изучение кода
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(){ Enumeration eProduct = 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 } }
-
Компания Используйте функцию displayProduct (Iterator iterator) для отображения всей информации о продуктах в консоли. Компания А не хочет меняться и настаивает на том, чтобы принять итератор в качестве параметра. **
Здесь шаблон проектирования адаптера может заставить его работать без каких-либо изменений, связанных с текущей системой и классом вендора. Компания должна создать класс адаптера для преобразования перечисления в итератор, как показано ниже
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); } }
-
Мы ничего не изменили ни в классе продуктов, ни в классе EnumProduct. Мы просто создаем новый класс Adapter для преобразования Enumration в класс Iterator. Готово.**
ссылка://тег/адаптер/[адаптер]ссылка://тег/дизайн-шаблон/[шаблон разработки]ссылка://тег/Java/[Java]