public class Main {
/**
* Менеджер наблюдателей с возможностью подписки,
* отписки и оповещения
*/
public static class EventManager {
// Список наблюдателей
List<EventListener> listeners = new ArrayList<>();
/**
* Подписка наблюдателя
* @param listener наблюдатель
*/
public void subscribe(EventListener listener) {
listeners.add(listener);
}
/**
* Отписка наблюдателя
* @param listener наблюдатель
*/
public void unsubscribe(EventListener listener) {
listeners.remove(listener);
}
/**
* Оповещение наблюдателей
* @param data данные для передачи наблюдателям
*/
public void notify(String data) {
for (EventListener listener : listeners) {
listener.update(data);
}
}
}
/**
* Сервис, отвечающий за изменения состояний техники
*/
public static class TransportService {
public EventManager eventManager;
public TransportService(EventManager eventManager) {
this.eventManager = eventManager;
}
/**
* Метод для изменения координат
* @param coordinates новые координаты
*/
public void changeCoordinates(String coordinates) {
// Оповещение всех подписчиков о смене координат
eventManager.notify(coordinates);
}
}
/**
* Наш наблюдатель
*/
public interface EventListener {
/**
* Метод, который будет выполнен, когда наблюдателя оповестят об изменении
* @param data данные изменения
*/
void update(String data);
}
/**
* Класс, отвечающий за отправку WebSocket сообщений
*/
public static class WsNotificationListener implements EventListener {
/**
* Демо метод отправки сообщений. Будет вызван при изменении
* Состояний техники
* @param data данные изменения
*/
@Override
public void update(String data) {
System.out.println("Sending message to ws session: " + data);
}
}
public static void main(String[] args) {
// Отправитель ws сообщений
WsNotificationListener wsNotificationListener = new WsNotificationListener();
// Манагер наблюдателей
EventManager eventManager = new EventManager();
// Отправитель ws сообщений подписывается на изменения
eventManager.subscribe(wsNotificationListener);
// Сервис транспорта. Передаем ему манагера наблюдателей
TransportService service = new TransportService(eventManager);
Random random = new Random();
for (int i = 0; i < 100; i++) {
// В сервисе транспорта меняем координаты, по выводу в консоль убеждаемся что происходит отправка ws сообщений
service.changeCoordinates(String.format("New Coordinates [%s, %s]", random.nextInt(), random.nextInt()));
}
}
} Post #195
259