Возможно ли более четко разделить обязанности классов?

Изучаю Java, делаю серверную часть своей игры, моя задача на данный момент - сделать backend, REST-сервис для общения с игровым клиентом.

Есть класс Browser - браузер "битв", где игрок может посмотреть созданные битвы ожидающие противников, отсортировать их (скажем, по длительности битвы или уровню профессионализма оппонента) и, выбрав, присоединиться к "битве".

public class Browser {
    private static final List<User> subscribers = ...;
    private static final List<PreparedBattle> battles = ...;

    public void subscribe() {...}
    public void unsubscribe() {...}
    ...
    public void createBattle(User creator, ...) {...}
    public void connect(int battleId) {...}
} 

И тут есть проблемка - например, в методе createBattle я должен вернуть текущему юзеру подробную информацию о созданной им битве. А остальным игрокам из subscribers мне нужно вернуть просто общую инфу "создана новая битва, id = 55, время битвы 10 мин".

Меня волнует архитектурный вопрос - правильно ли подготавливать и рассылать сообщения прямо из этого класса? Ведь он отвечает за логику приложения - создает битвы, стартует их. Не его обязанность готовить сообщения - создателю одно, остальным другое, потом может и еще что-то добавится такими темпами. Первый же из принципов SOLID говорит что так не надо делать и это разумно.

Выносить функционал общения с User в отдельный класс тоже особо не поможет, как ни крути, сообщение формировать надо все равно в Browser.

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


Ответы (1 шт):

Автор решения: Ansar Ozden

В общем, существует так называемый паттерн "Наблюдатель" (Observer). Существует много готовых решений реализующих этот паттерн. Например библиотеки реактивности,такие как RxJava и Project Reactor. Также, для вместо обычного http соединения можно использовать более продвинутый Websocket.

→ Ссылка