Определение: Определите зависимость от одного ко многим между объектами, чтобы, когда каждый объект изменяет свое состояние, все объекты, которые зависят от нее, будут уведомлены и автоматически обновлены.
Тип: поведенческий паттерн
Классовая диаграмма:
В программных системах часто возникает потребность: если состояние объекта изменяется, некоторые объекты, связанные с ним, также изменятся соответствующим образом. Например, мы хотим спроектировать функцию меню правой кнопкой мыши. Пока мы щелкнули правой кнопкой мыши в эффективной области программного обеспечения, появится меню; Например, мы хотим разработать функцию автоматического развертывания, как и при разработке Eclipse, если файл будет изменен, Eclipse автоматически развернет модифицированный файл на сервер. Существует сходство между этими двумя функциями, то есть одним объектом всегда должен контролировать другой объект, и если его состояние будет изменяться, он будет предпринять соответствующие действия. На самом деле, есть много решений, которые могут достичь этого, но использование модели наблюдателя, несомненно, является основным выбором.
Структура схемы наблюдателя
В самый основной режим наблюдателя включены следующие четыре символа:
Наблюдатель: из классовой диаграммы вы можете видеть, что в классе есть векторный контейнер, в котором хранится объект наблюдателя (причина, по которой вектор используется вместо списка, заключается в том, что при многопоточных операциях вектор безопасен, а список небезопасен). Этот векторный контейнер является ядром класса наблюдателя. Существует три других метода: метод прикрепления состоит в том, чтобы добавить объект наблюдателя в этот контейнер; Метод отсоединения состоит в том, чтобы удалить объект наблюдателя из контейнера; Метод уведомления состоит в том, чтобы вызовать соответствующие методы объекта наблюдателя по очереди. Эта роль может быть интерфейсом, абстрактным классом или конкретным классом, потому что во многих случаях она будет смешиваться с другими моделями, поэтому существует больше случаев использования абстрактных классов.
Наблюдатель: роль наблюдателя, как правило, является интерфейсом, который имеет только один метод обновления. Когда состояние наблюдателя изменится, этот метод будет вызван.
Конкретный наблюдатель: эта роль используется для легкого расширения, и в этой роли можно определить конкретную бизнес -логику.
Конкретный наблюдатель: конкретная реализация интерфейса наблюдателя. В этой роли логика, которая должна быть обработана при изменении состояния объекта.
Пример реализации режима наблюдателя
Субъект интерфейс
Общественный интерфейс субъект {public void Registerobserver (наблюдатель O); Public void RemoadObserver (наблюдатель O); public void notifyallobservers ();}Интерфейс наблюдателя
Общественный интерфейс stemver {public void update (субъект s);}Класс охотников реализует интерфейс субъекта
импортировать java.util.arraylist; Общедоступный класс головы реализует субъект {// Определить список пользователей, таких как Mike, Bill и т. Д. Private ArrayList <searver> пользовательский список; Private ArrayList <string> jobs; public Headhunter () {userlist = new ArrayList <Beaserver> (); jobs = new Arraylist <string> (); } @Override public void RegisterObServer (stemver O) {userList.Add (o); } @Override public void removeObserver (stemver o) {} @Override public void notifyallobservers () {for (stemver o: userlist) {o.update (this); }} public void AddJob (string job) {this.jobs.add (job); notifyallobservers (); } public arraylist <string> getJobs () {return jobs; } public String toString () {return jobs.toString (); }}Shipeeker - наблюдатель:
Общедоступный класс Jopseeker реализует наблюдатель {частное название строки; public Shieseeker (String name) {this.name = name; } @Override public void update (субъект s) {system.out.println (this.name + "получил уведомление!"); // Печать списка заданий System.out.println (s); }}Начните:
открытый класс main {public static void main (string [] args) {Headhunter HH = new Headhunter (); HH.GregisterObserver (New Shiesteker ("Mike")); HH.GregisterObserver (New Shiesteker ("Chris")); HH.GregisterObserver (New Shipeeker ("Jeff")); // Каждый раз, когда вы добавляете работу, все работы могут быть уведомлены. hh.addjob ("Google Job"); HH.Addjob ("Yahoo Job"); }} Преимущества режима наблюдателя
Наблюдатель и наблюдатель немного связаны и абстрактно связаны, так что их легче расширить для обоих.
Режим наблюдателя представляет собой обычно используемый механизм триггера, который образует триггерную цепь и обрабатывает методы каждого наблюдателя. Но в то же время это также является недостатком режима наблюдателя. Поскольку он запускается в цепочке, когда есть много наблюдателей, проблема производительности более тревожа. Более того, в цепочкой структуре с большей вероятностью возникают круговые эталонные ошибки, что приводит к фальсификации системы.
Суммировать
На языке Java существует интерфейс -наблюдатель и его класс реализации, который часто реализует роль наблюдателя. Мы можем просмотреть методы использования этих двух классов в документации JDK API.
Друзья, которые сделали VC ++, JavaScript DOM или AWT Development, все удивительны в отношении обработки событий. После понимания модели наблюдателя у них есть определенное понимание принципов механизма обработки событий. Если вы хотите спроектировать функцию механизма обработки, запускающего событие, использование режима наблюдателя является хорошим выбором. DEM обработки событий (модель событий делегирования) в AWT реализована с использованием режима наблюдателя.