Как реализовать шаблон проектирования Pluggable Adapter в Java

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

Заранее спасибо.

Не могли бы вы предоставить свой пример C#, чтобы мы могли помочь вам преобразовать его в каноническую Java?

Tobias Roland 08.04.2019 15:38

@TobiasRoland, спасибо за быстрый ответ, он использует делегатов C#, но у Java нет аналога для делегатов.

Juliyanage Silva 08.04.2019 15:41

В Интернете можно найти множество примеров для шаблона адаптера Java - например, tutorialspoint.com/design_pattern/adapter_pattern.htm был первым результатом, в Википедии также есть пример Java. Можете написать, на чем конкретно вы застряли?

Tobias Roland 08.04.2019 17:16

Java использует функциональные интерфейсы вместо делегатов

Matt Timmermans 09.04.2019 04:35

@TobiasRoland, это касается базового шаблона адаптера. Я знаю, как это реализовать.

Juliyanage Silva 09.04.2019 11:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
800
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В Java это очень просто, но нет никакого объекта, который действительно соответствовал бы подключаемому адаптеру, который вы могли бы использовать в C#.

Многие целевые интерфейсы адаптера — это Функциональные интерфейсы — интерфейсы, содержащие только один метод.

Когда вам нужно передать экземпляр такого интерфейса клиенту, вы можете легко указать адаптер, используя лямбда-функцию или ссылку на метод. Например:

interface IRequired
{
   String doWhatClientNeeds(int x);
}

class Client
{
   public void doTheThing(IRequired target);
}

class Adaptee
{
    public String adapteeMethod(int x);
}

class ClassThatNeedsAdapter
{
    private final Adaptee m_whatIHave;

    public String doThingWithClient(Client client)
    {
       // super easy lambda adapter implements IRequired.doWhatClientNeeds
       client.doTheThing(x -> m_whatIHave.adapteeMethod(x));
    }

    public String doOtherThingWithClient(Client client)
    {
       // method reference implements IRequired.doWhatClientNeeds
       client.doTheThing(this::_complexAdapterMethod);
    }

    private String _complexAdapterMethod(int x)
    {
        ...
    }
}

Когда целевой интерфейс имеет более одного метода, мы используем анонимный внутренний класс:

interface IRequired
{
   String clientNeed1(int x);
   int clientNeed2(String x);
}

class Client
{
   public void doTheThing(IRequired target);
}


class ClassThatNeedsAdapter
{
    private final Adaptee m_whatIHave;

    public String doThingWithClient(Client client)
    {
       IRequired adapter = new IRequired() {
           public String clientNeed1(int x) {
               return m_whatIHave.whatever(x);
           }
           public int clientNeed2(String x) {
               return m_whatIHave.whateverElse(x);
           }
       };
       return client.doTheThing(adapter);
    }
}

Чем отличается PluggableAdapter от обычного адаптера? ClassThatNeedsAdapter будет отличаться для каждого клиента, и каждый клиент создаст адаптер (анонимный класс по-прежнему остается классом). Какая в нем "подключаемая" часть?

nits.kk 19.04.2020 22:07

@nits.kk Он отличается тем, что он написан встроенным - у него нет собственного имени, вам не нужно писать его в другом месте, и вам не нужно следовать ссылке, чтобы увидеть его. Это то же самое, что и важные отличия в версии C#. Является ли это «все еще классом» или нет, имеет значение только педантично.

Matt Timmermans 19.04.2020 22:15

хорошо, но если вы видите книгу GOF о подключаемом адаптере, вы можете увидеть Explicit отдельные конкретные классы для DirectoryBrowser / DirectoryTreeDisplay . Итак, все же мой вопрос в том, чем этот особенный, чем обычные адаптеры. Это взято из книги GOF: Elements of Reusable Object-Oriented Software, поэтому я думаю, что это аутентичный материал без добавления историй или интерпретаций, просто мне нужна помощь в его понимании. Я хочу понять пример в нем, а не внешние разные примеры.. Я также поставил еще один stackoverflow.com/q/61311594/504133. Пожалуйста помоги

nits.kk 19.04.2020 23:20

В этом нет ничего особенного, но и съемные адаптеры тоже не являются чем-то особенным. Они просто используют немного сахара, специфичного для C#, чтобы выполнить то, что делается другими способами в других языках.

Matt Timmermans 19.04.2020 23:31

Я согласен с этим, но это было упомянуто в книге без какой-либо ссылки на сахар, специфичный для языка ... Они также предоставили для них умлы ... это вызвало сомнения и путаницу.

nits.kk 19.04.2020 23:33

или может быть один и тот же термин «Подключаемый адаптер» используется для обозначения двух разных концепций, одна из которых представлена ​​вами в вашем ответе, а другая представлена ​​​​в книге GOF. Не могли бы вы передать мой вопрос, может быть, это даст больше ясности.

nits.kk 19.04.2020 23:42

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

Matt Timmermans 19.04.2020 23:52

Другие вопросы по теме