Шаблон состояния или наблюдателя в объекте C ++

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


person J.Dave    schedule 03.01.2017    source источник
comment
Похоже, вы в чем-то неправильно поняли паттерн Наблюдатель. Обновляемый компонент (в вашем случае скорость, gps, двигатель, топливо и т. Д.) Известен как Observable или Subject, и компонент, который хочет знать об обновлениях для Субъект известен как Наблюдатель.   -  person CKing    schedule 04.01.2017


Ответы (2)


Меня немного смущает разница между наблюдателем и шаблоном состояния

Шаблон Наблюдатель в основном используется, когда у вас есть объект или набор объектов (известные как Наблюдатели), которые хотят получать информацию / обновлять о любых изменениях в состоянии одного или нескольких объектов (известных как наблюдаемые или субъекты). В вашем примере Network - это Наблюдатель, который хочет знать об изменениях в данных самолета. С другой стороны, объекты данных Airplane, такие как Speed, GPS и т. Д., Являются Observable или Subjects, которые Network хочет отслеживать на предмет изменений. (Кажется, ваша терминология перевернута). Каждый раз, когда данные Airplane, такие как Speed, изменяются, Network должен получать уведомление об этом изменении с помощью соответствующего объекта Speed ​​.

С другой стороны, шаблон Состояние в основном используется, когда ваш вариант использования может быть представлен как конечный автомат. В вашем примере весь процесс взлета, полета и посадки Самолета может быть представлен в конечном автомате с логическими состояниями, такими как приземление, взлет, полет, посадка и т. Д.

Теперь должно быть ясно, что шаблоны Observer и State имеют допустимое применение в вашем случае с шаблоном Observer, подходящим для основной проблемы. заявление, которое вы описали в своем вопросе. При этом нет необходимости иметь отдельные наблюдаемые объекты, такие как скорость, GPS и т. Д. У вас может быть один объект Observable с именем FlighData, который имеет такие атрибуты, как скорость, GPS, engineFuelLevel, engineTemp и т. Д.

Я также рекомендую вам лучше понять шаблон Observer, прежде чем реализовывать его в своем приложении. Вот несколько ссылок для начала:

person CKing    schedule 04.01.2017

Создайте автомат «Состояние-событие-действие» для определения системы (например, для ошибки, блокировки или какого-либо другого условия проверки и т. Д.) - здесь можно использовать шаблон проектирования состояния. Шаблон наблюдателя используется, когда между объектами существует связь «один-несколько», например, если один объект изменен, его зависимые объекты должны быть уведомлены автоматически. Мы используем шаблон проектирования наблюдателя, когда наблюдаемый не знает о наблюдателях и должен иметь возможность уведомлять другие объекты, не зная объектов.

person Deb S    schedule 03.01.2017
comment
Вы сказали, что шаблон наблюдателя используется, когда между объектами существует связь "один-ко-многим". Не правда. Вы можете использовать шаблон Observer, даже если у вас есть один Observable, за которым наблюдает один Observable. Кроме того, вы упоминаете, что шаблон состояния - лучший выбор, не объясняя, как лучше реализовать пример в исходном вопросе через шаблон состояния. Какие компоненты данного примера можно вписать в шаблон состояний и как? В нынешнем виде вы, кажется, определили шаблоны, но не их использование в текущем контексте. - person CKing; 04.01.2017