
Лаб_12 Головков И.Е. 12002108 Наблюдатель
.docxБЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
Кафедра информационных и робототехнических систем
Отчет по лабораторной работе № 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; } }