Меня немного смущает разница между наблюдателем и шаблоном состояния. Мне дали проект, в котором клиент - это самолет в полете, который вычисляет данные для различных датчиков, таких как GPS, скорость, уровень топлива, а затем данные отправляются в сеть, а затем на сервер. На данный момент я использовал шаблон наблюдателя для своей диаграммы классов. Диаграмму классов можно увидеть снизу. Пожалуйста, дайте мне знать, правильно ли мое решение и подходит ли выбранный шаблон проектирования для этого решения.
Шаблон состояния или наблюдателя в объекте C ++
Ответы (2)
Меня немного смущает разница между наблюдателем и шаблоном состояния
Шаблон Наблюдатель в основном используется, когда у вас есть объект или набор объектов (известные как Наблюдатели), которые хотят получать информацию / обновлять о любых изменениях в состоянии одного или нескольких объектов (известных как наблюдаемые или субъекты). В вашем примере Network
- это Наблюдатель, который хочет знать об изменениях в данных самолета. С другой стороны, объекты данных Airplane, такие как Speed
, GPS
и т. Д., Являются Observable или Subjects, которые Network
хочет отслеживать на предмет изменений. (Кажется, ваша терминология перевернута). Каждый раз, когда данные Airplane, такие как Speed
, изменяются, Network
должен получать уведомление об этом изменении с помощью соответствующего объекта Speed .
С другой стороны, шаблон Состояние в основном используется, когда ваш вариант использования может быть представлен как конечный автомат. В вашем примере весь процесс взлета, полета и посадки Самолета может быть представлен в конечном автомате с логическими состояниями, такими как приземление, взлет, полет, посадка и т. Д.
Теперь должно быть ясно, что шаблоны Observer и State имеют допустимое применение в вашем случае с шаблоном Observer, подходящим для основной проблемы. заявление, которое вы описали в своем вопросе. При этом нет необходимости иметь отдельные наблюдаемые объекты, такие как скорость, GPS и т. Д. У вас может быть один объект Observable с именем FlighData
, который имеет такие атрибуты, как скорость, GPS, engineFuelLevel, engineTemp и т. Д.
Я также рекомендую вам лучше понять шаблон Observer, прежде чем реализовывать его в своем приложении. Вот несколько ссылок для начала:
Создайте автомат «Состояние-событие-действие» для определения системы (например, для ошибки, блокировки или какого-либо другого условия проверки и т. Д.) - здесь можно использовать шаблон проектирования состояния. Шаблон наблюдателя используется, когда между объектами существует связь «один-несколько», например, если один объект изменен, его зависимые объекты должны быть уведомлены автоматически. Мы используем шаблон проектирования наблюдателя, когда наблюдаемый не знает о наблюдателях и должен иметь возможность уведомлять другие объекты, не зная объектов.