Рубрики
Без рубрики

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

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

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

тематическое исследование

Компания 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(){
		 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
	 }   
	
}

Компания 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/”