'

Язык программирования Java

Понравилась презентация – покажи это...





Слайд 0

Язык программирования Java Дмитриев Андрей Владиславович andrei-dmitriev@yandex.ru 2007


Слайд 1

Наблюдатель (Observer) Определяет между объектами зависимость типа один-ко-многим так, что при изменении состояния одного объекта, все зависящие от него объекты получают об этом оповещение.


Слайд 2

Наблюдатель class LogConsole extends Terminal{ private color = Color.BLACK; void setColor(Color c){ this.color = c; } } Класс LogConsole должен изменять цвет вывода сообщений в зависимости от их приоритета, определяемого и устанавливаемого классом MainWindow.


Слайд 3

Наблюдатель (cont.) class MainWindow{ LogConsole logConsole = LogConsole.create(); void userAction(Action a){ if (a.getLevel() == Level.isCritical()) { logConsole.setColor(Color.RED); } } } Данный класс может напрямую изменять состояние подчиненного объекта при изменении ситуации:


Слайд 4

Наблюдатель (cont.) class MainWindow{ … //все поля и методы остаются IntrusionDetector id = IntrusionDetector.get(); void userAction(Action a){ … //все прошлые действия остаются if (a.getLevel() == Level.isIntrusion()) { id.alarm(); } } } У нас появился еще один класс, заинтересованный в типе действия пользователя – IntrusionDetector.


Слайд 5

Наблюдатель (cont.) public interface ActionObserver{ void actionHappen(Action a); } Для большей структурированности имеет смысл выделить круг классов, заинтересованных в данном типе событий:


Слайд 6

Наблюдатель (cont.) class LogConsole extends Terminal implements ActionObserver { void actionHappen(Action a){ if (a.getLevel() == Level.isCritical()) { setColor(Color.RED); } } } Теперь класс LogConsole и IntrusionDetector можно причислить к кругу заинтересованных:


Слайд 7

Наблюдатель (cont.) class IntrusionDetector implements ActionObserver{ public void actionHappen(Action a){ if (a.getLevel() == Level.isIntrusion()) { alarm(); } Аналогично с классом IntrusionDetector:


Слайд 8

Наблюдатель (cont.) class MainWindow{ ActionObserver []observers = new ActionObserver [10]; void userAction(Action a){ //обход массива for (…) { observers[i].actionHappen(a); } //заметим, что вся логика по обработке //события переместилась в конкретные классы. } } Класс MainWindow должен хранить ссылки на все классы, заинтересованные в событиях:


Слайд 9

Наблюдатель (cont.) class MainWindow{ ActionObserver []observers = new ActionObserver [10]; … public void addActionObserver(ActionObserver aa){ observers[last++] = aa; } public void removeActionObserver(ActionObserver aa){ //удаление объекта из массива } } Класс MainWindow должен предоставлять интерфейс для пополнения списка объектов, заинтересованных в данных сообщениях:


Слайд 10

Пример реализации наблюдателя в JDK import java.awt.event.* … List list = new List(); il = new ItemListener(){ //метод будет вызываться каждый раз при //изменении состояния списка public void itemStateChanged(ItemEvent e){ System.out.println(“event ” + e); } }; list.addItemListener(il); Наблюдатель – любой класс, реализующий один или несколько слушателей: MouseListener, ItemListener, FocusListener, и т.д.


Слайд 11

Наблюдатель (иллюстрация)


Слайд 12

Наблюдатель (выводы) Позволяет избежать циклических опросов состояния. Возможность реализовать неограниченное число наблюдателей.


×

HTML:





Ссылка: