Адаптер, адаптер, адаптер ~ На самом деле шаблон проектирования адаптера можно рассматривать как простую программу преобразования/класс. Обычно он используется для создания двух несовместимых интерфейсов или классов для совместной работы. Пожалуйста, ознакомьтесь ниже Адаптер дизайн рисунка изображения, нарисованного мной, немного некрасиво :)
ссылка://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]