Зачем использовать шаблон дизайна адаптера - PullRequest
1 голос
/ 04 апреля 2019

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

Теперь я смотрю на этот пример .

interface ITarget
{
  List<string> GetProducts();
}


public class VendorAdaptee
{
   public List<string> GetListOfProducts()
   {
      List<string> products = new List<string>();
      products.Add("Gaming Consoles");
      products.Add("Television");
      products.Add("Books");
      products.Add("Musical Instruments");
      return products;
   }
}

class VendorAdapter:ITarget
{
   public List<string> GetProducts()
   {
      VendorAdaptee adaptee = new VendorAdaptee();
      return adaptee.GetListOfProducts();
   }
}

class ShoppingPortalClient
{
   static void Main(string[] args)
   {
      ITarget adapter = new  VendorAdapter();
      foreach (string product in adapter.GetProducts())
      {
        Console.WriteLine(product);
      }
      Console.ReadLine();
   }
}

Итак, основываясь на описании ShoppingPortalClient хочет использовать VendorAdaptee , но не может из-за несовместимого интерфейса. Вот мой глупый вопрос ... почему ShoppingPortalClient не может просто сделать это:

var adaptee = new VendorAdaptee();

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Пример не имеет смысла. Нет никаких причин использовать адаптер в ShoppingPortalClient, потому что у этого класса нет требования использовать интерфейс ITarget.

Если ему нужно было куда-то передать ITarget, например, если ему нужно было вызвать performSomeOperation(ITarget) в другом классе, , тогда имеет смысл создать адаптер для передачи.

1 голос
/ 04 апреля 2019

ShoppingPortalClient не может напрямую использовать адаптер, потому что интерфейс адаптера не является ITarget (что он ожидает).Другими словами, VendorAdaptee не имеет метода GetProducts(), он имеет метод GetListOfProducts().Это разные интерфейсы.Это не будет работать с существующей системой управления запасами, которую использует ShoppingPortalClient.

0 голосов
/ 26 июня 2019

В этом примере Основной метод (клиент или пользователь) работает с типом класса ITarget .
Основной метод Не знаю о VendorAdaptee.

ИтакОсновной метод вызовет GetProducts () для получения данных.Но в нашем классе его нет, поэтому мы не можем его использовать.

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

После преобразования VendorAdaptee в ITarget и реализации GetProducts () мы можем использовать код.

Для получения более подробной информации посетите Шаблон проектирования адаптера в Java или Шаблоны проектирования разработки программного обеспечения

...