Last updated
Last updated
Шаблонът за проектиране на наблюдател е полезен, когато се интересувате от състоянието на даден обект и искате да получавате известия, когато има някаква промяна. В модела на наблюдателя Обектът, който наблюдава състоянието на друг Обект, се нарича наблюдател, а Обектът, който се наблюдава, се нарича субект.
Като пример за Java програма която използва модела на наблюдател, ще реализираме тема и наблюдателите могат да се регистрират в тази тема. Всеки път, когато в темата бъде публикувано ново съобщение, всички наблюдатели ще бъдат уведомени и те могат да използват съобщението. Основният интерфейс ще е Subject, който дефинира договорните методи, които трябва да бъдат приложени от всеки конкретен субект.
След това ще създадем договор за наблюдателя, ще има метод за прикачване на субекта към наблюдателя и друг метод, който да се използва от субекта за уведомяване за всяка промяна.
Сега договорът е готов, продължава се с конкретна имплементация.
Реализацията на метода за регистриране и дерегистриране на наблюдател е много проста, допълнителният метод е postMessage(), който ще се използва от клиентското приложение за публикуване на String съобщение в темата. Забележете булевата променлива за проследяване на промяната в състоянието на темата и използвана при уведомяване на наблюдатели. Тази променлива е необходима, така че ако няма актуализация и някой извика метод notifyObservers(), той не изпраща фалшиви известия до наблюдателите. Забележете също използването на синхронизация в метода notifyObservers(), за да сте сигурни, че известието се изпраща само до наблюдателите, регистрирани преди съобщението да бъде публикувано в темата. Ето изпълнението на Наблюдатели, които ще наблюдават темата.
Обърнете внимание на внедряването на метода update(), където той извиква метода Subject getUpdate(), за да накара съобщението да се консумира. Можехме да избегнем това извикване, като подадохме съобщение като аргумент на метода update(). Ето една проста тестова програма за използване на внедряването на нашата тема.