Режим наблюдателя (иногда называемый режим публикации-подписки, режим модели, режим источника или подчиненного режима)-это тип режима проектирования программного обеспечения. В этом режиме целевой объект управляет всеми объектами наблюдателя, которые зависят от него, и активно выдают уведомления при изменении его состояния. Это обычно достигается путем вызова методов каждого наблюдателя. Этот шаблон обычно используется для реализации систем обработки событий.
Режим наблюдателя идеально отделяет наблюдателя от наблюдаемого объекта. Например, пользовательский интерфейс может использоваться в качестве наблюдателя, а бизнес -данные являются наблюдателем. Пользовательский интерфейс наблюдает изменения в бизнес -данных. После обнаружения изменений в данных он будет отображаться на интерфейсе. Одним из принципов объектно-ориентированного дизайна является то, что каждый класс в системе будет сосредоточен на одной функции, а не на других аспектах. Человек делает только одно и делает это хорошо. Режим наблюдателя рисует четкие границы между модулями, улучшая обслуживание и повторное использование применения.
Паттерн дизайна наблюдателя определяет зависимость от одного ко многим между объектами, так что при изменении состояния объекта все объекты, которые зависят от него, были уведомлены и автоматически обновляются.
Метод реализации:
Существует много способов реализовать модель наблюдателя, и, по сути, шаблон должен содержать две роли: наблюдатель и наблюдаемый объект. В примере только сейчас бизнес -данные - это объект, который следует соблюдать, а пользовательский интерфейс является наблюдателем. Существует логическая связь между наблюдателем и наблюдателем. Когда наблюдатель изменится, наблюдатель будет наблюдать за такими изменениями и отвечать соответствующим образом. Если такой процесс наблюдения используется между пользовательским интерфейсом и бизнес -данными, может быть обеспечено, что граница между интерфейсом и данными нарисована. Предполагая, что потребности приложения изменяются, производительность интерфейса необходимо изменить. Только пользовательский интерфейс должен быть реконструирован, и бизнес -данные не должны меняться.
1. Наблюдатель
(Наблюдатель) регистрируется в субъекте, а наблюдаемый объект хранит наблюдатель в контейнере.
2. Наблюдается
Наблюдаемый объект имеет некоторые изменения (как показано на одном ходе на рисунке), и все зарегистрированные наблюдатели получают из контейнера и уведомляют наблюдателя об изменении.
3. Отменить наблюдение
Наблюдатель говорит наблюдателю отменить наблюдение и удаляет наблюдателя из контейнера.
Когда наблюдатель регистрируется в контейнере наблюдателя, наблюдатель не должен спрашивать о конкретном типе наблюдателя, но должен использовать интерфейс наблюдателя. Это преимущество: при условии, что в программе есть другие наблюдатели, если этот наблюдатель также реализуется одним и тем же интерфейсом. Наблюдаемый человек может соответствовать нескольким наблюдателям. Когда человек наблюдается, меняется, он может уведомить всех наблюдателей один за другим. На основе интерфейсов, а не конкретных реализаций - это обеспечивает большую гибкость для программ.
Демонстрационный код:
Определите роль абстрактного класса, который будет наблюдаться:
Пакет Test.edu.mainrole; импортировать java.util.arraylist; Общественный абстрактный класс Absrole {private ArrayList <Iobserver> list = new Arraylist <Iobserver> (); public void Add (Iobserver stemver) {list.add (stemver); } public void DELETE (IOBServer Observer) {list.remove (stemver); } public void addifyobservers (string newState) {for (iobserver stemver: list) {exerver.update (newState); }}} Наблюдаемая роль подкласса:
Пакет Test.edu.mainrole; Роль открытого класса расширяет Absrole {частное строковое состояние; public String getState () {return State; } public void изменение (string nupdate) {state = nupdate; this.nodifyobservers (состояние); }} Определите интерфейс наблюдателя:
Пакет Test.edu.mainrole; публичный интерфейс iobserver {public void update (String newState); } Конкретные наблюдатели:
Пакет Test.edu.mainrole; открытый класс ObserverObj1 реализует iobserver {private String xersverstate; @Override public void update (string vate) {vemverstate = state; System.out.println («Статус наблюдателя 1 IS:» + Observerstate); }} Пакет Test.edu.mainrole; открытый класс ObserverObj2 реализует iobserver {private String xersverstate; @Override public void update (string vate) {vemverstate = state; System.out.println («Статус наблюдателя 2 IS:» + Observerstate); }} Тестируйте клиент:
Пакет Test.edu.mainrole; Public Class Client { / ** * @param args * / public static void main (string [] args) {role subject = new Role (); Iobserver xersver1 = new ebserverobj1 (); Iobserver xersver2 = new xerverobj2 (); субъект. ADD (Observer1); субъект. ADD (Observer2); tubal.Change («Обновление!»); }} Результаты работы:
Состояние наблюдателя 1: обновление! Состояние наблюдателя 2: обновление!
Выше приведено все об этой статье, и я надеюсь, что она вдохновит вас учиться.