Как реализовать шаблон проектирования Pluggable Adapter в Java - PullRequest
1 голос
/ 08 апреля 2019

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

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

1 Ответ

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

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

В 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);
    }
}
...