23 Образцы дизайна Глава 13:
Определение: Определите зависимость от одного ко многим между объектами, чтобы, когда каждый объект изменяет свое состояние, все объекты, которые зависят от нее, будут уведомлены и автоматически обновлены.
Тип: поведенческий паттерн
Классовая диаграмма:
В программных системах часто возникает потребность: если состояние объекта изменяется, некоторые объекты, связанные с ним, также изменятся соответствующим образом.
Например, мы хотим спроектировать функцию меню правой кнопкой мыши. Пока мы щелкнули правой кнопкой мыши в эффективной области программного обеспечения, появится меню;
Например, нам необходимо разработать функцию автоматического развертывания, как и при разработке Eclipse, если файл изменен, Eclipse автоматически развернет модифицированный файл на сервер.
Существует сходство между этими двумя функциями, то есть одним объектом всегда должен контролировать другой объект, и если его состояние будет изменяться, он будет предпринять соответствующие действия. На самом деле, есть много решений, которые могут достичь этого, но использование модели наблюдателя, несомненно, является основным выбором.
Структура схемы наблюдателя
В самый основной режим наблюдателя включены следующие четыре символа:
Наблюдатель: из классовой диаграммы вы можете увидеть, что в классе есть векторный контейнер, который хранит объект наблюдателя (причина, по которой вы используете вектор вместо списка, заключается в том, что есть много
При потоке вектор безопасен, в то время как список небезопасен), этот векторный контейнер является ядром класса наблюдателя, и есть три других метода: метод прикрепления - добавить объект наблюдателя в этот контейнер; Метод отсоединения состоит в том, чтобы удалить объект наблюдателя из контейнера; Метод уведомления состоит в том, чтобы вызовать соответствующие методы объекта наблюдателя по очереди. Эта роль может быть интерфейсом, абстрактным классом или конкретным классом, потому что во многих случаях она будет смешиваться с другими моделями, поэтому существует больше случаев использования абстрактных классов.
Наблюдатель: роль наблюдателя, как правило, является интерфейсом, который имеет только один метод обновления. Когда состояние наблюдателя изменится, этот метод будет вызван.
Конкретный наблюдатель: эта роль используется для легкого расширения, и в этой роли можно определить конкретную бизнес -логику.
Конкретный наблюдатель: конкретная реализация интерфейса наблюдателя. В этой роли логика, которая должна быть обработана при изменении состояния объекта.
Реализация кода режима наблюдателя
Общественный абстрактный класс субъект {частный вектор <exerver> obs = new Vector <Beaserver> (); public void AddObserver (Observer obs) {this.obs.add (obs); } public void delobserver (Observer obs) {this.obs.remove (obs); } protected void notifyObserver () {for (stemver o: obs) {o.update (); }} public Abstract void dosomething (); } public Class concretesubject расширяет субъект {public void dosomething () {System.out.println («Возвращено событием наблюдателя»); this.notifyobserver (); }} Общественный интерфейс stemver {public void update (); } Public Class ConcreteObserver1 реализует imserver {public void upply () {System.out.println («Наблюдатель 1 получает сообщение и обрабатывает его»); }} public class concreteObserver2 реализует Observer {public void Update () {System.out.println ("Наблюдатель 2 получает сообщение и обрабатывает его."); }} Public Class Client {public static void main (string [] args) {субъект sub = new Concretesubject (); sub.addobserver (new ConceteObserver1 ()); // Добавить Observer1 sub.Addobserver (new ConceteObserver2 ()); // Добавить Observer2 sub.dosomething (); }} Результаты бега
Событие наблюдателя перевернуто, и наблюдатель 1 получает информацию и обрабатывает ее.
Наблюдатель 2 получает информацию и обрабатывает ее.
Благодаря выполнению результатов, мы видим, что мы только называем метод субъекта, но соответствующие методы обоих наблюдателей вызываются одновременно. Если вы внимательно посмотрите на код, это на самом деле очень просто. Это не что иное, как только вы, как вы связываете класс наблюдателя в классе субъекта и проходите метод обновления наблюдателя в методе Dosome.
Преимущества режима наблюдателя
Наблюдатель и наблюдатель немного связаны и абстрактно связаны, так что их легче расширить для обоих.
Режим наблюдателя представляет собой обычно используемый механизм триггера, который образует триггерную цепь и обрабатывает методы каждого наблюдателя. Но в то же время это также является недостатком режима наблюдателя. Поскольку он запускается в цепочке, когда есть много наблюдателей, проблема производительности более тревожа. Более того, в цепочкой структуре с большей вероятностью возникают круговые эталонные ошибки, что приводит к фальсификации системы.
Суммировать
На языке Java существует интерфейс -наблюдатель и его класс реализации, который часто реализует роль наблюдателя. Мы можем просмотреть методы использования этих двух классов в документации JDK API.
Друзья, которые сделали VC ++, JavaScript DOM или AWT Development, все удивительны в отношении обработки событий. После понимания модели наблюдателя у них есть определенное понимание принципов механизма обработки событий. Если вы хотите спроектировать функцию механизма обработки, запускающего событие, использование режима наблюдателя является хорошим выбором. DEM обработки событий (модель событий делегирования) в AWT реализована с использованием режима наблюдателя.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.