Статьи

Шаблон дизайна адаптера в Java

Шаблон проектирования адаптера является структурным шаблоном проектирования, который помогает нам подключаться к устаревшему или стороннему коду, который предоставляет аналогичные функциональные возможности через другой интерфейс.

Реальная аналогия для адаптера — это та, которую мы используем для подключения 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, являются их собственными.