Шаблон проектирования адаптера является структурным шаблоном проектирования, который помогает нам подключаться к устаревшему или стороннему коду, который предоставляет аналогичные функциональные возможности через другой интерфейс.
Реальная аналогия для адаптера — это та, которую мы используем для подключения USB-кабеля к порту Ethernet.
При разработке объектно-ориентированного приложения мы можем почувствовать потребность в адаптере, когда скажем, что наш клиент ожидает объект определенного типа, и у нас есть сторонний API, предлагающий те же функциональные возможности, но через несовместимый интерфейс.
Он также широко известен как оболочка, поскольку он оборачивает существующий код новым интерфейсом, что делает его совместимым с клиентом.
терминологической:
Давайте будем в курсе терминов, которые мы используем, когда говорим о шаблоне адаптера:
- Клиент: класс, который хочет использовать стороннюю библиотеку или внешнюю систему
- Adaptee: класс в сторонней библиотеке или во внешней системе, который мы хотим использовать
- Целевой интерфейс: желаемый интерфейс, который будет использовать клиент
- Адаптер: этот класс находится между клиентом и адаптером и реализует целевой интерфейс
Использование шаблона адаптера:
Допустим, у нас есть ShopInventory, который поддерживает список продуктов. Позже, мы взяли на себя другой инвентарь магазина, который продает продукты. Теперь мы хотим добавить эти предметы в наш ShopInventory . Проблема, с которой мы столкнулись, заключается в том, что хотя GroceryItem — это просто тип продукта, но он не связан с интерфейсом продукта .
Чтобы решить эту проблему, мы будем использовать шаблон адаптера. Мы создадим GroceryItemAdapter, который будет реализовывать интерфейс Product :
С помощью адаптера мы теперь сможем рассматривать GroceryItem как продукт, не изменяя ничего в стороннем коде ( GroceryItem ).
Реализация Java:
Давайте сначала начнем с определения класса Product и ShopInventory :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public interface Product { String getName(); double getPrice(); } public class ShopInventory { private List<Product> products; public ShopInventory() { this .products = new ArrayList<>(); } public void addProduct(Product product) { this .products.add(product); } public void removeProduct(Product product) { this .products.remove(product); } } |
Сторонний магазин, который мы только что захватили, хранит GroceryItem ‘s:
1
2
3
4
5
6
7
8
|
//third-party code public class GroceryItem { String itemName; int costPerUnit; //constructor, getters and setters } |
Поскольку наш ShopInventory содержит только элементы типа Product , давайте создадим адаптер для недавно представленного GroceryItem :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public class GroceryItemAdapter implements Product { private GroceryItem groceryItem; public GroceryItemAdapter(GroceryItem groceryItem) { this .groceryItem = groceryItem; } public String getName() { return groceryItem.getItemName(); } public double getPrice() { return groceryItem.getCostPerUnit(); } } |
Теперь мы можем добавлять как наши обычные продукты, так и продукты в наш ShopInventory:
01
02
03
04
05
06
07
08
09
10
11
|
//code in our main method ShopInventory inventory = new ShopInventory(); //adding regular store products - ones that implement Product interface inventory.addProduct( new CosmeticProduct( "Lavie Handbag" , 5000.0 )); inventory.addProduct( new FitnessProduct( "Yoga SmartFit" , 2000.75 )); //adding GroceryItem to the store using an adapter GroceryItem groceryItem = new GroceryItem( "Wheat Flour" , 100 ); inventory.addProduct( new GroceryItemAdapter(groceryItem)); |
Вывод:
Шаблон адаптера помогает нам соединить два несовместимых интерфейса, демонстрирующих одинаковую бизнес-функциональность.
С помощью шаблона адаптера мы преобразуем существующий интерфейс в другой интерфейс, ожидаемый клиентским кодом.
Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Шаблон проектирования адаптера в Java Мнения, высказанные участниками Java Code Geeks, являются их собственными. |