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

Шаблон проектирования адаптера в Java

Шаблон проектирования адаптера на Java. Пример учебника по образцу адаптера на java. Пример шаблона проектирования адаптера Java с использованием Адаптера Класса, Адаптера объекта.

Автор оригинала: Pankaj Kumar.

Шаблон проектирования адаптера является одним из шаблонов структурного проектирования и используется для совместной работы двух несвязанных интерфейсов. Объект, который соединяет эти несвязанные интерфейсы, называется Адаптером .

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

Одним из замечательных примеров дизайна адаптера в реальной жизни является мобильное зарядное устройство. Для зарядки мобильного аккумулятора требуется 3 вольта, но обычная розетка выдает напряжение 120 В (США) или 240 В (Индия). Таким образом, мобильное зарядное устройство работает как адаптер между мобильной зарядной розеткой и настенной розеткой.

В этом уроке мы попытаемся реализовать мультиадаптер с использованием шаблона проектирования адаптера.

Итак, прежде всего у нас будет два класса – Вольт (для измерения вольт) и Розетка (производящая постоянные вольты 120 В).

package com.journaldev.design.adapter;

public class Volt {

	private int volts;
	
	public Volt(int v){
		this.volts=v;
	}

	public int getVolts() {
		return volts;
	}

	public void setVolts(int volts) {
		this.volts = volts;
	}
	
}
package com.journaldev.design.adapter;

public class Socket {

	public Volt getVolt(){
		return new Volt(120);
	}
}

Теперь мы хотим создать адаптер, который может вырабатывать 3 вольта, 12 вольт и 120 вольт по умолчанию. Поэтому прежде всего мы создадим интерфейс адаптера с помощью этих методов.

package com.journaldev.design.adapter;

public interface SocketAdapter {

	public Volt get120Volt();
		
	public Volt get12Volt();
	
	public Volt get3Volt();
}

Шаблон Двухстороннего Адаптера

При реализации шаблона адаптера существует два подхода – адаптер класса и адаптер объекта, однако оба эти подхода дают один и тот же результат.

  1. Адаптер класса – Эта форма использует наследование java и расширяет исходный интерфейс, в нашем случае класс сокета.
  2. Адаптер объекта – В этой форме используется Java-композиция , а адаптер содержит исходный объект.

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

Вот адаптер класса реализация подхода нашего адаптера.

package com.journaldev.design.adapter;

//Using inheritance for adapter pattern
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{

	@Override
	public Volt get120Volt() {
		return getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}

}

Шаблон Проектирования Адаптера – Реализация Адаптера Объекта

Вот Объектный адаптер реализация нашего адаптера.

package com.journaldev.design.adapter;

public class SocketObjectAdapterImpl implements SocketAdapter{

	//Using Composition for adapter pattern
	private Socket sock = new Socket();
	
	@Override
	public Volt get120Volt() {
		return sock.getVolt();
	}

	@Override
	public Volt get12Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,10);
	}

	@Override
	public Volt get3Volt() {
		Volt v= sock.getVolt();
		return convertVolt(v,40);
	}
	
	private Volt convertVolt(Volt v, int i) {
		return new Volt(v.getVolts()/i);
	}
}

Обратите внимание, что обе реализации адаптера почти одинаковы и реализуют интерфейс Адаптер сокета . Интерфейс адаптера также может быть абстрактным классом .

Вот тестовая программа для использования нашей реализации шаблона проектирования адаптера.

package com.journaldev.design.test;

import com.journaldev.design.adapter.SocketAdapter;
import com.journaldev.design.adapter.SocketClassAdapterImpl;
import com.journaldev.design.adapter.SocketObjectAdapterImpl;
import com.journaldev.design.adapter.Volt;

public class AdapterPatternTest {

	public static void main(String[] args) {
		
		testClassAdapter();
		testObjectAdapter();
	}

	private static void testObjectAdapter() {
		SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Object Adapter="+v3.getVolts());
		System.out.println("v12 volts using Object Adapter="+v12.getVolts());
		System.out.println("v120 volts using Object Adapter="+v120.getVolts());
	}

	private static void testClassAdapter() {
		SocketAdapter sockAdapter = new SocketClassAdapterImpl();
		Volt v3 = getVolt(sockAdapter,3);
		Volt v12 = getVolt(sockAdapter,12);
		Volt v120 = getVolt(sockAdapter,120);
		System.out.println("v3 volts using Class Adapter="+v3.getVolts());
		System.out.println("v12 volts using Class Adapter="+v12.getVolts());
		System.out.println("v120 volts using Class Adapter="+v120.getVolts());
	}
	
	private static Volt getVolt(SocketAdapter sockAdapter, int i) {
		switch (i){
		case 3: return sockAdapter.get3Volt();
		case 12: return sockAdapter.get12Volt();
		case 120: return sockAdapter.get120Volt();
		default: return sockAdapter.get120Volt();
		}
	}
}

Когда мы запускаем вышеуказанную тестовую программу, мы получаем следующий вывод.

v3 volts using Class Adapter=3
v12 volts using Class Adapter=12
v120 volts using Class Adapter=120
v3 volts using Object Adapter=3
v12 volts using Object Adapter=12
v120 volts using Object Adapter=120

Схема Классов Шаблонов Проектирования Адаптеров

Пример шаблона проектирования адаптера в JDK

Некоторые примеры шаблонов проектирования адаптеров, которые я мог бы легко найти в классах JDK, являются;

  • java.util.Массивы#asList()
  • java.io.InputStreamReader(входной поток) (возвращает средство чтения)
  • java.io.OutputStreamWriter(выходной поток) (возвращает запись)

Это все для шаблона проектирования адаптера в java.