Режим наблюдателя является одним из режимов проектирования программного обеспечения и также обычно используется, особенно в программировании GUI. Есть много статей о шаблонах дизайна, написанных в Интернете, и многие статьи хорошо написаны. Хотя есть подозрение на повторение раннего колеса, это колесо не другое колесо, с различным фокусом, разными идеями и разными способами рассказать об этом.
Ключевые элементы
тема:
Тема - это объект, наблюдаемый наблюдателем. Тема должна иметь следующие три характеристики.
Наблюдатель:
Когда субъект меняется, получение уведомлений для конкретной обработки является функцией, которую должен иметь наблюдатель.
Зачем использовать этот режим
Вот пример, чтобы проиллюстрировать, что станция доставки молока является темой. Заказчик по подписке на молоко является монитором. После того, как клиент подписывается на молоко от станции доставки молока, он будет получать молоко каждый день. Если клиент не хочет подписываться, он может отменить, и он не будет получать молоко в будущем.
Свободная связь
Наблюдатель добавляет или удаляет код без изменения темы, просто вызовите соответствующий метод добавления или удаления темы.
Субъект несет ответственность только за уведомление наблюдателя, но не нужно знать, как наблюдатель имеет дело с уведомлением. Например, станция доставки молока отвечает только за доставку молока и не заботится о том, пьет ли клиент его или моет лицо.
Наблюдатель просто должен ждать уведомления о теме, не наблюдая детали, связанные с темой. Что касается того же примера, клиенты должны заботиться только о станции доставки молока, чтобы доставить молоко, а не о том, из какого курьера или с какой транспортировкой для доставки молока.
Java реализует режим наблюдателя
1. собственная реализация Java
Классная диаграмма
/ ** * Цель наблюдения наследует от java.util.observable * @author stone * */ public class updateobservable extends vestriebable {private int data; public updateObservable (stemver stemver) {AddoBserver (stemver); / * * Добавить другой наблюдатель */} public int getData () {return data; } public void setData (int data) {if (data! = this.data) {this.data = data; setChanged (); // Изменения тега, notifyObservers (); // уведомление}} @Override public synchronized void addobserver (stemver o) {super.addobserver (o); } @Override public synchronized void deleteobserver (stemver o) {super.deleteobserver (o); } @Override public void notifyObservers () {super.notifyobservers (); } @Override public void notifyObservers (Object arg) {super.notifyobservers (arg); } @Override public synchronized void deleteObservers () {super.deleteObservers (); } @Override защищен синхронизированный void setchanged () {super.setchanged (); } @Override защищен синхронизированный void clearchanged () {super.clearching (); } @Override public synchronized boolean haschanged () {return super.haschanged (); } @Override public synchronized int countobservers () {return super.countobservers (); }} / ** * Наблюдатель реализует интерфейс java.util.observer * @author stone * */ public class updateobserver реализует stemver {@override public void update (наблюдаемый O, объект arg) {System.out.println («Полученное уведомление об изменении данных:«); if (o exanceOf updateObservable) {updateObServable uo = (updateObServable) o; System.out.print ("Данные изменены на:" + uo.getData ()); }}} 2. Пользовательская модель наблюдения
Классная диаграмма
/ ** * Abstract Observer * Обновление наблюдения * @author Stone * */ public interface iwatcher {/ * * Интерфейс уведомлений: * 1. Простое уведомление * 2. Наблюдатель нуждаются в данных об изменении цели, поэтому цель может использоваться в качестве параметра, см. Наблюдатель Java и наблюдаемое * // // void uppost (iwatched смотрели); void update (); } / ** * Аннотация целевой субъект * Предоставляет интерфейс для регистрации и удаления объектов наблюдателя, а также интерфейс для уведомления наблюдателей за соблюдение * и интерфейс, которому наблюдается цель * @author Stone * */ public interface iwatchedsubject {public void add (iwatcher watch); public void remove (iwatcher watch); public void notifywhatchers (); Public void Update (); // Интерфейс с наблюдаемыми бизнес -изменениями} / ** * Специфический наблюдатель от конкретного наблюдателя * * @author Stone * */ public Class UpdateWatcher реализует iWatcher {@Override public void update () {System.out.println (это + "Наблюдается: цель была обновлена"); }} / ** * Специальная целевая роль конкретная субъект * @author Stone * */ public class updatewatchedsubject реализует iwatchedsubject {private list <iwatcher> list; public updateWatchedSubject () {this.List = new ArrayList <Iwatcher> (); } @Override public void add (iwatcher watch) {this.list.add (watch); } @Override public void remove (iwatcher watch) {this.list.remove (watch); } @Override public void notifyWhatchers () {for (iwatcher Watcher: list) {watcher.update (); }} @Override public void update () {System.out.println ("Target Update ......"); notifyWhatchers (); }} Слушатель - это реализация наблюдателя:
Классная диаграмма
/ ** * Слушатель после регистрации * @author Stone * */ public interface iregisterlistener {void onRegiaRed (); } / ** * Слушатель, когда пользователь входит в систему * @author Stone * */ public interface iloginlistener {void onlogined (); } /** Слушатель - это реализация режима наблюдателя* Добавить слушателей к некоторым бизнес -интерфейсам, которые требуют прослушивания, вызовите соответствующие методы слушателя для реализации слушания*/ public Class User {public void Register (IReGisterListener Register) {/** Do ... Register*/ System.out.println ("Регистрация ..."); // после регистрационного регистра. } public void login (iloginListener login) { / * * do ... login * / system.out.println ("Регистрация ..."); // после login.onlogined (); }} /*** Поведенческая шаблон режима наблюдателя* Режим наблюдателя определяет зависимость от одного ко многим, позволяя нескольким объектам наблюдателя одновременно наблюдать целевой объект. * Когда этот целевой объект изменяется в своем состоянии, он уведомит все объекты наблюдателя, чтобы они могли автоматически обновляться. Целевой объект нуждается в интерфейсе для добавления, удаления и уведомления наблюдателей * * @author Stone */ public Class Test {public static void main (string [] args) {/ * * Используйте собственный интерфейс java Observer и наблюдаемый класс */ updateobServable vasembable = new UpdateObServable (New UpdateObserver ()); Наблюдаемый.setData (99); System.out.println ("" "); System.out.println ("" "); /** Пользовательская модель наблюдателя*/ iwatchedSubject смотрю = new UpdateWatchedSubject (); Смотреть.add (new UpdateWatcher ()); Смотреть.add (new UpdateWatcher ()); Смотрел.update (); System.out.println ("" "); /** Sub-listener*/ user user = new user (); user.register (new iregisterlistener () {@override public void onRegistered () {System.out.println ("После прослушивания регистрации ...");}}); user.login (new iloginlistener () {@override public void onlogined () {System.out.println ("После прослушивания входа ...");}}); }}Печать
Полученное уведомление об изменении данных: данные изменяются на: 99 Цель обновляется ... Наблюдается veamver.updatewatcher@457471e0. Полем Полем Вход в систему ... после прослушивания входа в систему. Полем Полем