Кіріспе

Бағдарламалық жасақтама мен инженерияда бақылаушы үлгісі – тәуелділерінің тізімін ұстап тұратын және оларға кез келген күй өзгерістерін автоматты түрде хабарлайтын, «субъект» деп аталатын объектіге негізделген бағдарламалық жасақтама үлгісі. Хабарлау әдетте олардың әдістерінің бірін шақыру арқылы жүзеге асырылады. Бұл үлгі көбінесе оқиғаларға негізделген бағдарламалық жасақтамада таратылған оқиғаларды басқару жүйелерін іске асыру үшін қолданылады. Мұндай жүйелерде субъект әдетте «оқиғалар ағыны» немесе «оқиғалар ағынының көзі» деп аталады, ал бақылаушылар «оқиғаларды қабылдаушылар» деп аталады. Ағын терминологиясы бақылаушылардың физикалық түрде бөлек орналасқан және субъект/ағын көзінен шығарылатын оқиғаларды бақылау мүмкіндігі болмайтын физикалық құрылымға сілтеме жасайды. Осыған байланысты, бұл үлгі бастапқыда процессорға қолжетімді емес, кейіннен кездейсоқ келіп түсетін деректермен жұмыс істеуге арналған (HTTP сұраныстары, GPIO деректері, сыртқы құрылғылардан және таратылған деректер базаларынан пайдаланушының кірісі және т.б.).

Қуатты немесе әлсіз эталон

Байқаушы үлгісі естелік ағуына себеп болуы мүмкін, бұл «ұмытылған тыңдаушы» мәселесі деп аталады. Себебі, қарапайым іске асыруда, ол нақты тіркелуді де, нақты тіркеуден шығаруды да қажет етеді, мысалы, «жою» үлгісіндегідей. Бұған себебі, нысан бақылаушыларға күшті сілтемелерді сақтайды, осылайша оларды жандандырып тұрады. Егер нысан бақылаушыларға әлсіз сілтемелерді сақтаса, мұны болдырмауға болады.

Қиылыстыру және әдеттегі жариялау- жазылу іске асырулары

Көбінесе, бақылаушы үлгісі байқалатын нысанның күй өзгерістерін бақыланатын (және бақылаушыларға хабарланатын) нысанның бір бөлігі ретінде жүзеге асырылады. Мұндай жүзеге асыру тығыз байланысты деп есептеледі, бақылаушылар мен нысан бір-бірін білуге және олардың ішкі бөліктеріне қол жеткізуге мәжбүр болады, бұл масштабталу, жылдамдық, хабарламаны қалпына келтіру және техникалық қызмет көрсету (оқиға немесе хабарлама жоғалуы деп те аталады), шартты таратудың икемділігінің болмауы және қажетті қауіпсіздік шараларына кедергі келтіру сияқты мәселелерге әкелуі мүмкін. Жариялау-жазылу үлгісінің кейбір (талдаусыз) жүзеге асыруларында бұл мәселе бақылаушы мен бақыланатын нысан арасында қосымша кезең ретінде арнайы хабар кезегі серверін (және кейде қосымша хабар өңдеуші нысанын) құру арқылы шешіледі, осылайша компоненттерді ажыратады. Мұндай жағдайларда, бақылаушылар бақылаушы үлгісі арқылы хабар кезегі серверіне кіреді, белгілі бір хабарламаларға жазылады және күтілетін хабарлама туралы ғана біледі (немесе кейбір жағдайларда білмейді), ал хабарлама жіберуші туралы ештеңе білмейді; жіберуші де бақылаушылар туралы ештеңе білмеуі мүмкін. Мүдделі тараптарға хабарлау және байланысқа ұқсас нәтижеге қол жеткізетін жариялау-жазылу үлгісінің басқа да жүзеге асырулары бақылаушы үлгісін пайдаланбайды. OS/2 және Windows сияқты көп терезелі операциялық жүйелердің алғашқы жүзеге асыруларында «жариялау-жазылу үлгісі» және «оқиғаға негізделген бағдарламалық жасақтаманы әзірлеу» терминдері бақылаушы үлгісінің синонимдері ретінде қолданылды. Дизайн үлгілері кітабында сипатталған бақылаушы үлгісі өте қарапайым ұғым болып табылады және бақыланатын нысанға қызығушылықты жоюға немесе бақылаушыларға хабарлау алдында немесе кейін орындалатын арнайы логикаға мүмкіндік бермейді. Бұл үлгі өзгеріс туралы хабарламаларды тіркеуге немесе олардың қабылдануын қамтамасыз етуге де қатысты емес. Мұндай мәселелер әдетте хабарлама кезегі жүйелерінде қарастырылады, онда бақылаушы үлгісі шағын ғана рөл атқарады. Қатысты үлгілерге жариялау-жазылу, делдал және жеке нысан жатады.

Қоспаланған емес

Байқаушы үлгісі, жариялау-жазылу механизмі болмаған жағдайда, мысалы, модельдің күйі жиі жаңартылатын кезде қолданылуы мүмкін. Жиі жаңартулар көріністің селкілдеуіне немесе жауапсыз болуына әкелуі мүмкін (мысалы, көптеген қайта бояу шақыруларын орындау арқылы); мұндай жағдайда бақылаушылар таймерді пайдалануы тиіс. Өзгеріс хабарламаларымен шамадан тыс жүктелудің орнына, бақылаушы көріністі модельдің шамамен күйін белгілі бір интервалмен көрсетуге мүмкіндік береді. Бұл бақылаушы режимі прогресс жолақтары үшін ерекше пайдалы, онда негізгі операцияның барысы жиі өзгеріп отырады.

UML класы мен реттілік диаграммасы

UML кластық диаграммасында Subject класы тәуелді объектілердің күйін тікелей жаңартпайды. Оның орнына, Subject күйді жаңартпақ үшін Observer интерфейсіне (жаңарту) сілтеме жасайды, бұл Subject-ті тәуелді объектілердің күйі қалай жаңартылатындығына тәуелсіз етеді. Observer1 және Observer2 кластары Observer интерфейсін олардың күйін Subject-тің күйімен синхрондау арқылы іске асырады. UML реттілік диаграммасы орындалу кезіндегі өзара әрекеттесулерді көрсетеді: Observer1 және Observer2 объектілері өздерін тіркеу үшін Subject1-ге attach(this) деп шақырады. Егер Subject1-дің күйі өзгерсе, Subject1 өзін хабарлауға (notify) шақырады. notify тіркелген Observer1 және Observer2 объектілеріне жаңарту (update) шақыруларын жібереді, олар өзгерген деректерді (getState) Subject1-ден сұрап, олардың күйін жаңартады (синхрондайды).

Мысал

Кітапханада java.util.Observer және java.util.Observable кластары бар болғанымен, олар Java 9-да қолданыстан шығарылды, себебі іске асырылған модель өте шектеулі болды. Төменде пернетақтадан кіріс алып, әрбір кіріс жолын оқиға ретінде өңдейтін Java-да жазылған мысал келтірілген. System.in-нен жол келген кезде, оқиғаның орын алғанын бақылаушыларға олардың update әдістерін шақыру арқылы хабарлау үшін notifyObservers әдісі шақырылады.