Я знаю, как реализовать базовый шаблон проектирования адаптера, а также знаю, как С# использует делегирование для реализации дизайна подключаемого адаптера. Но я не смог найти ничего реализованного на Java. Не могли бы вы указать пример кода.
Заранее спасибо.
@TobiasRoland, спасибо за быстрый ответ, он использует делегатов C#, но у Java нет аналога для делегатов.
В Интернете можно найти множество примеров для шаблона адаптера Java - например, tutorialspoint.com/design_pattern/adapter_pattern.htm был первым результатом, в Википедии также есть пример Java. Можете написать, на чем конкретно вы застряли?
Java использует функциональные интерфейсы вместо делегатов
@TobiasRoland, это касается базового шаблона адаптера. Я знаю, как это реализовать.
Шаблон подключаемого адаптера — это метод создания адаптеров, который не требует создания нового класса для каждого адаптируемого интерфейса, который необходимо поддерживать.
В 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 Он отличается тем, что он написан встроенным - у него нет собственного имени, вам не нужно писать его в другом месте, и вам не нужно следовать ссылке, чтобы увидеть его. Это то же самое, что и важные отличия в версии C#. Является ли это «все еще классом» или нет, имеет значение только педантично.
хорошо, но если вы видите книгу GOF о подключаемом адаптере, вы можете увидеть Explicit отдельные конкретные классы для DirectoryBrowser
/ DirectoryTreeDisplay
. Итак, все же мой вопрос в том, чем этот особенный, чем обычные адаптеры. Это взято из книги GOF: Elements of Reusable Object-Oriented Software, поэтому я думаю, что это аутентичный материал без добавления историй или интерпретаций, просто мне нужна помощь в его понимании. Я хочу понять пример в нем, а не внешние разные примеры.. Я также поставил еще один stackoverflow.com/q/61311594/504133. Пожалуйста помоги
В этом нет ничего особенного, но и съемные адаптеры тоже не являются чем-то особенным. Они просто используют немного сахара, специфичного для C#, чтобы выполнить то, что делается другими способами в других языках.
Я согласен с этим, но это было упомянуто в книге без какой-либо ссылки на сахар, специфичный для языка ... Они также предоставили для них умлы ... это вызвало сомнения и путаницу.
или может быть один и тот же термин «Подключаемый адаптер» используется для обозначения двух разных концепций, одна из которых представлена вами в вашем ответе, а другая представлена в книге GOF. Не могли бы вы передать мой вопрос, может быть, это даст больше ясности.
Техника, на которую они ссылаются, та же самая, но с мелким сахаром. Я отвечу на ваш другой вопрос, хотя
Не могли бы вы предоставить свой пример C#, чтобы мы могли помочь вам преобразовать его в каноническую Java?