Автор оригинала: 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();
}
Шаблон Двухстороннего Адаптера
При реализации шаблона адаптера существует два подхода – адаптер класса и адаптер объекта, однако оба эти подхода дают один и тот же результат.
- Адаптер класса – Эта форма использует наследование java и расширяет исходный интерфейс, в нашем случае класс сокета.
- Адаптер объекта – В этой форме используется 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.