Автор оригинала: 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.