Шаблон дизайна адаптера

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

ссылка://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]