Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб_12 Головков И.Е. 12002108 Наблюдатель

.docx
Скачиваний:
3
Добавлен:
26.06.2024
Размер:
260.31 Кб
Скачать

БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ

ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»

(НИУ «БелГУ»)

ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

Кафедра информационных и робототехнических систем

Отчет по лабораторной работе № 12 по дисциплине «Методы и средства проектирования информационных систем и технологий»

Вариант № 3

Тема работы «Наблюдатель»

студента очного отделения

3 курса 12002108 группы

Головкова Игоря Евгеньевича

Проверил:

асс. Пузырев Никита Сергеевич

БЕЛГОРОД, 2024

Вариант №3

Реализовать простую подсистему мониторинга состояния пользователей системы. Система работает по следующему принципу – к системе могут быть подключены множество пользователей. Объект каждого пользователя хранит id, имя, время подключения и список имен всех других пользователей системы. Если к системе подключается еще один пользователь то в список имен уже подключенных добавляется новое имя. Пользователи могут изменять имя по ходу выполнения программы. Тогда в списках у других подключенных пользователей оно должно измениться. Использовать шаблон наблюдатель.

Диаграмма классов для программы представлена на рисунке 1.

Рисунок 1 – Диаграмма классов

Результат работы программы, использующей паттерн наблюдатель, представлена на рисунке 2.

Рисунок 2 – Результат работы программы, использующей паттерн адаптер

// Интерфейс IObservable public interface IObservable<T> { void addObserver(T t); void removeObserver(T t); void notifyObservers(); }

public interface IObserver { void updateUsernames(List<String> usernames); } // Класс Main

public class Main { public static void main(String[] args) { MonitoringSystem monitoringSystem = new MonitoringSystem(); User user1 = new User("П 1.0", monitoringSystem); user1.changeUsernameTo("П 1.1"); User user2 = new User("П 2.0", monitoringSystem); User user3 = new User("П 3.0", monitoringSystem); user2.changeUsernameTo("П 2.1"); monitoringSystem.removeObserver(user1); user1.changeUsernameTo("П 1.2"); } } // Класс MonitoringSystem

public class MonitoringSystem implements IObservable<User> { private final List<User> usersObservers = new ArrayList<>(); @Override public void addObserver(User user) { usersObservers.add(user); notifyObservers(); } @Override public void removeObserver(User user) { usersObservers.remove(user); System.out.println(STR."Пользователь \{user.getUsername()} больше в системе мониторинга\n"); } @Override public void notifyObservers() { for (User user : usersObservers) { List<String> usernames = usersObservers.stream() .map(User::getUsername) .filter(username -> !user.getUsername().equals(username)) .toList(); user.updateUsernames(usernames); } } } // Класс User

public class User implements IObserver { private final IObservable<User> monitoringSystem; private final UserData userData; @Getter private String username; private List<String> otherUsernames = new ArrayList<>(); public User(String username, IObservable<User> monitoringSystem) { this.monitoringSystem = monitoringSystem; this.username = username; userData = new UserData(UUID.randomUUID(), System.currentTimeMillis()); System.out.println(STR."Добавлен пользователь с именем '\{username}'\n"); this.monitoringSystem.addObserver(this); } public void changeUsernameTo(String username) { System.out.println(STR."Пользователь с именем '\{this.username}' меняет имя на '\{username}'"); this.username = username; monitoringSystem.notifyObservers(); } @Override public void updateUsernames(List<String> otherUsernames) { this.otherUsernames = otherUsernames; if (! otherUsernames.isEmpty()) { System.out.println(STR."Пользователь \{username} содержит имена: "); for (String oneOfUsernames : this.otherUsernames) { System.out.println(oneOfUsernames); } } else { System.out.println(STR."Пользователь \{username} пока не содержит имён других пользователей"); } System.out.println(); } // Класс UserData @AllArgsConstructor private static class UserData { private final UUID uuid; private long connectionTime; } }