В Java, что вы называете этот шаблон / идиома? - PullRequest
0 голосов
/ 08 февраля 2019

Моя библиотека Java предоставляет интерфейс SomethingClient с одним классом реализации SomethingClientImpl.Интерфейс содержит методы, которые будут вызываться приложением, как и следовало ожидать.

Но есть «зеркальный» интерфейс SomethingHandler, который содержит методы, предоставляемые обратными вызовами приложения - приложения.Вы можете вообразить, что приложение предоставляет библиотеке объект этого интерфейса - возможно, методу Factory, из которого получается SomethingClient.

Как неопытный Java-дизайнер, Мне интересно знатьесть ли имя для и рекомендуется ли * в какой степени / в какой степени также предоставлять интерфейс и класс, объединяющий обе концепции:

public interface SomethingClient { /*..*/ }

public interface SomethingHandler { /*..*/ }

public interface ClientAndHandler extends SomethingClient, 
                                          SomethingHandler { }

public abstract class ClientAndHandler_Impl implements ClientAndHandler {

    final SomethingClient clientImpl_;

    ClientAndHandler_Impl(SomethingClient clientImpl) {
        this.clientImpl_ = clientImpl;
    }

    // TODO now all SomethingClient methods are implemented in terms of clientImpl_
    // AND, SomethingHandler methods are left abstract so they are implemented by the application
}

Предполагается, что разработчик приложения может предпочестьвыход из абстрактного класса ClientAndHandler_Impl и реализация методов обратного вызова, возможно, с точки зрения клиентских (исходящих) методов.Это можно сделать с относительной легкостью.Предполагая, что вы это сделаете, какое имя вы бы дали концепции ClientAndHandler?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Во-первых, это не шаблон проектирования.В некотором роде он содержит один: шаблон делегирования .

Что касается объединения интерфейсов, я мог бы назвать это «составной маркерный интерфейс » или что-то в этом роде.Я не знаю ни одного принятого названия для этого.

Это плохо по нескольким причинам.Во-первых, мой класс может реализовывать A и B отдельно, но если он не реализует AAndB, тогда он не будет соответствовать типу этих методов.Поэтому пересечение общего типа является предпочтительным.

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

0 голосов
/ 08 февраля 2019

Скелетная реализация

Ваш текущий код немного похож на скелетную реализацию.Вы можете прочитать больше об этом в Массачусетском технологическом институте или в dzon .

Идея заключается в том, чтобы предоставить клиенту реализацию по умолчанию.Вы можете найти некоторые примеры в Java-Collections-API, такие как AbstractCollection, AbstractSet и AbstractMap.

Некоторые предложения

Интерфейс с избыточным количеством

Интерфейс ClientAndHandler является избыточным.Класс ClientAndHandler_Impl должен реализовывать SomethingClient и SomethingHandler.

Именование

Я бы назвал абстрактный класс от ClientAndHandler_Impl до AbstractClientInteraction или ClientInteractionSkeleton, если вы хотите сделатьПонятно, что вы используете скелетную реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...