{"id":3460,"date":"2026-03-26T14:18:56","date_gmt":"2026-03-26T06:18:56","guid":{"rendered":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/"},"modified":"2026-03-26T14:18:56","modified_gmt":"2026-03-26T06:18:56","slug":"applying-observer-pattern-loose-coupling","status":"publish","type":"post","link":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/","title":{"rendered":"Przewodnik OOAD: Zastosowanie wzorca obserwatora do osi\u0105gni\u0119cia roz\u0142\u0105czno\u015bci"},"content":{"rendered":"<p>Na tle analizy i projektowania obiektowego (OOAD) jednym z najtrwalszych wyzwa\u0144, z jakimi musz\u0105 si\u0119 zmierzy\u0107 deweloperzy, jest zarz\u0105dzanie zale\u017cno\u015bciami mi\u0119dzy sk\u0142adnikami. Gdy obiekty zbyt du\u017co wiedz\u0105 o sobie nawzajem, system staje si\u0119 sztywny, trudny do testowania i podatny na zjawisko kaskadowych awarii. Aby zaradzi\u0107 tej strukturalnej niestabilno\u015bci, <strong>wzorzec obserwatora<\/strong>wyr\u00f3\u017cnia si\u0119 jako podstawowy wzorzec zachowania. Ustanawia mechanizm subskrypcji, kt\u00f3ry pozwala obiektom komunikowa\u0107 si\u0119 bez tworzenia bezpo\u015brednich, sztywnie zakodowanych po\u0142\u0105cze\u0144. Ten przewodnik bada mechanizmy dzia\u0142ania, implementacj\u0119 oraz strategiczne zastosowanie wzorca obserwatora w celu osi\u0105gni\u0119cia rzeczywistej roz\u0142\u0105czno\u015bci w architekturze Twojego oprogramowania.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img alt=\"Child-style crayon drawing infographic explaining the Observer Pattern: a central Subject character notifies multiple Observer characters through loose connections, illustrating decoupled software design with playful visuals and simple English labels\" decoding=\"async\" src=\"https:\/\/www.go2posts.com\/wp-content\/uploads\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\"\/><\/figure>\n<\/div>\n<h2>\ud83e\udde9 Zrozumienie wzorca obserwatora<\/h2>\n<p>W esencji wzorzec obserwatora definiuje zale\u017cno\u015b\u0107 jeden do wielu mi\u0119dzy obiektami. Gdy jeden obiekt, znany jako Podmiot, zmienia sw\u00f3j stan, wszystkie jego zale\u017cne obiekty, znane jako Obserwatorzy, s\u0105 powiadamiane i automatycznie aktualizowane. Ta relacja jest dynamiczna, co oznacza, \u017ce obiekty mog\u0105 w dowolnym momencie czasu do\u0142\u0105cza\u0107 lub od\u0142\u0105cza\u0107 si\u0119 od tej relacji. G\u0142\u00f3wnym celem jest roz\u0142\u0105czenie Podmiotu od jego Obserwator\u00f3w. Podmiot nie musi zna\u0107 konkretnych klas Obserwator\u00f3w; musi tylko wiedzie\u0107, \u017ce implementuj\u0105 one okre\u015blony interfejs.<\/p>\n<p>Ten wzorzec jest szczeg\u00f3lnie warto\u015bciowy w systemach, w kt\u00f3rych stan sk\u0142adnika wywo\u0142uje dzia\u0142ania w innych cz\u0119\u015bciach systemu. Na przyk\u0142ad rozwa\u017c przep\u0142yw przetwarzania danych, w kt\u00f3rym zmiana rekordu \u017ar\u00f3d\u0142owego musi wywo\u0142a\u0107 aktualizacj\u0119 pami\u0119ci podr\u0119cznej, pliku dziennika i wy\u015bwietlania interfejsu u\u017cytkownika. Bez tego wzorca rekord \u017ar\u00f3d\u0142owy musia\u0142by przechowywa\u0107 odniesienia do pami\u0119ci podr\u0119cznej, logera i logiki wy\u015bwietlania. Powoduje to silne powi\u0105zanie. Wprowadzaj\u0105c wzorzec obserwatora, rekord \u017ar\u00f3d\u0142owy po prostu powiadamia interfejs, a konkretne implementacje zajmuj\u0105 si\u0119 logik\u0105 powiadamiania.<\/p>\n<h2>\ud83d\udd27 Podstawowe sk\u0142adniki wzorca<\/h2>\n<p>Aby skutecznie zaimplementowa\u0107 ten wzorzec, musisz zidentyfikowa\u0107 i zdefiniowa\u0107 konkretne role w architekturze. Te role zapewniaj\u0105, \u017ce zasada rozdzielenia odpowiedzialno\u015bci pozostaje niezak\u0142\u00f3cona.<\/p>\n<ul>\n<li><strong>Podmiot:<\/strong> Jest to obiekt obserwowany. Przechowuje list\u0119 Obserwator\u00f3w i zapewnia metody do do\u0142\u0105czania, od\u0142\u0105czania i powiadamiania ich. Podmiot odpowiada za rozg\u0142aszanie zmian stanu.<\/li>\n<li><strong>Obserwator:<\/strong> Jest to interfejs lub klasa abstrakcyjna definiuj\u0105ca metod\u0119 aktualizacji. Ka\u017cda klasa, kt\u00f3ra chce otrzymywa\u0107 powiadomienia, musi zaimplementowa\u0107 ten interfejs. Zapewnia sp\u00f3jny kontrakt dla otrzymywania aktualizacji.<\/li>\n<li><strong>ConcreteSubject:<\/strong> Jest to rzeczywista implementacja Podmiotu. Przechowuje stan i uruchamia logik\u0119 powiadamiania, gdy ten stan si\u0119 zmienia.<\/li>\n<li><strong>ConcreteObserver:<\/strong> S\u0105 to konkretne implementacje interfejsu Obserwatora. Zawieraj\u0105 logik\u0119 reagowania na powiadomienie od Podmiotu.<\/li>\n<li><strong>Klient:<\/strong> Jest to cz\u0119\u015b\u0107 aplikacji, kt\u00f3ra tworzy ConcreteSubjects i ConcreteObservers oraz ustala relacj\u0119 mi\u0119dzy nimi.<\/li>\n<\/ul>\n<p>\u015acis\u0142e przestrzeganie tych r\u00f3l zapewnia, \u017ce Podmiot nigdy nie zale\u017cy od wewn\u0119trznych dzia\u0142a\u0144 Obserwatora. Zale\u017cy tylko od interfejsu. To w\u0142a\u015bnie definicja zasad segregacji interfejs\u00f3w i odwr\u00f3cenia zale\u017cno\u015bci w dzia\u0142aniu.<\/p>\n<h2>\ud83c\udf09 Mechanizm osi\u0105gania roz\u0142\u0105czno\u015bci<\/h2>\n<p>G\u0142\u00f3wn\u0105 zalet\u0105 tego wzorca jest zmniejszenie zale\u017cno\u015bci. W tradycyjnym podej\u015bciu obiektowym obiekt A mo\u017ce bezpo\u015brednio tworzy\u0107 obiekt B w celu wykonania dzia\u0142ania. Je\u015bli obiekt B ulegnie zmianie, obiekt A musi zosta\u0107 ponownie skompilowany lub przepisany. W przypadku wzorca obserwatora obiekt A (Podmiot) komunikuje si\u0119 z list\u0105 interfejs\u00f3w. Obiekt B (Obserwator) implementuje ten interfejs.<\/p>\n<p>Rozwa\u017c nast\u0119puj\u0105ce scenariusze dotycz\u0105ce zale\u017cno\u015bci:<\/p>\n<ul>\n<li><strong>Silne powi\u0105zanie:<\/strong> Podmiot przechowuje konkretny odniesienie do Obserwatora. Zmiany w klasie Obserwatora wymagaj\u0105 zmian w klasie Podmiotu.<\/li>\n<li><strong>Roz\u0142\u0105czno\u015b\u0107:<\/strong> Podmiot przechowuje odniesienie do interfejsu Obserwatora. ConcreteObserver jest zarejestrowany w czasie wykonywania. Podmiot pozostaje nie\u015bwiadomy konkretnej logiki ConcreteObserver.<\/li>\n<\/ul>\n<p>Ta roz\u0142\u0105czno\u015b\u0107 pozwala na wi\u0119ksz\u0105 elastyczno\u015b\u0107. Mo\u017cesz dodawa\u0107 nowych obserwator\u00f3w do podmiotu bez modyfikowania kodu podmiotu. Mo\u017cesz dynamicznie usuwa\u0107 obserwator\u00f3w. Zgodnie z zasad\u0105 Otwarto\u015b\u0107\/Zamkni\u0119to\u015b\u0107, kt\u00f3ra m\u00f3wi, \u017ce jednostki oprogramowania powinny by\u0107 otwarte na rozszerzanie, ale zamkni\u0119te na modyfikacj\u0119.<\/p>\n<h2>\ud83d\udee0\ufe0f Strategia implementacji<\/h2>\n<p>Implementacja wzorca obserwatora wymaga ostro\u017cnej uwagi na cykl \u017cycia subskrypcji. Proces og\u00f3lnie sk\u0142ada si\u0119 z nast\u0119puj\u0105cych krok\u00f3w:<\/p>\n<ol>\n<li><strong>Zdefiniuj interfejs:<\/strong> Utw\u00f3rz wsp\u00f3lny interfejs dla obserwatora. Ten interfejs powinien zawiera\u0107 metod\u0119<code>update<\/code> kt\u00f3ra akceptuje stan lub odniesienie do obiektu Subject.<\/li>\n<li><strong>Zaimplementuj obiekt Subject:<\/strong> Utw\u00f3rz klas\u0119 Subject z kolekcj\u0105 do przechowywania obserwator\u00f3w. Zaimplementuj metody<code>attach<\/code>, <code>detach<\/code>, oraz<code>notify<\/code> metody.<\/li>\n<li><strong>Zaimplementuj konkretne obserwatory:<\/strong> Utw\u00f3rz klasy, kt\u00f3re implementuj\u0105 interfejs Observer. Wewn\u0105trz metody<code>update<\/code> zdefiniuj specyficzne logiki wymagane dla danego typu obserwatora.<\/li>\n<li><strong>Ustan\u00f3w relacje:<\/strong> W kodzie klienta zainicjuj obiekt Subject i obserwator\u00f3w. Wywo\u0142aj metod\u0119 attach na obiekcie Subject, aby je po\u0142\u0105czy\u0107.<\/li>\n<li><strong>Wyzwij aktualizacje:<\/strong> Gdy stan obiektu Subject ulegnie zmianie, wywo\u0142aj metod\u0119 notify. Obiekt Subject iteruje po li\u015bcie obserwator\u00f3w i wywo\u0142uje ich metody update.<\/li>\n<\/ol>\n<p>Kluczowe jest, aby proces powiadomienia nie blokowa\u0142 obiektu Subject nieprzerwanie. Je\u015bli jeden obserwator potrzebuje d\u0142ugiego czasu na przetworzenie aktualizacji, mo\u017ce to pogorszy\u0107 wydajno\u015b\u0107 obiektu Subject. Dlatego p\u0119tla powiadomie\u0144 powinna by\u0107 wydajna.<\/p>\n<h2>\ud83d\udcca Zalety i wady<\/h2>\n<p>Podobnie jak wszystkie wzorce projektowe, wzorzec Obserwatora ma zalety i wady. Zrozumienie tych aspekt\u00f3w pomaga w decyzji, kiedy go stosowa\u0107.<\/p>\n<table>\n<tr>\n<th><strong>Aspekt<\/strong><\/th>\n<th><strong>Szczeg\u00f3\u0142y<\/strong><\/th>\n<\/tr>\n<tr>\n<td><strong>Roz\u0142\u0105czno\u015b\u0107<\/strong><\/td>\n<td>Obiekt Subject i obserwatorzy s\u0105 niezale\u017cne. Mo\u017cesz zmieni\u0107 jeden bez istotnego wp\u0142ywu na drugi.<\/td>\n<\/tr>\n<tr>\n<td><strong>Dynamiczne relacje<\/strong><\/td>\n<td>Obserwatorzy mog\u0105 by\u0107 dodawani lub usuwani w czasie dzia\u0142ania bez ponownego kompilowania obiektu Subject.<\/td>\n<\/tr>\n<tr>\n<td><strong>Wsparcie dla nadawania<\/strong><\/td>\n<td>Jedna zmiana stanu mo\u017ce wyzwoli\u0107 aktualizacje w wielu obiektach jednocze\u015bnie.<\/td>\n<\/tr>\n<tr>\n<td><strong>Nieprzewidywalne aktualizacje<\/strong><\/td>\n<td>Kolejno\u015b\u0107, w jakiej obserwatorzy otrzymuj\u0105 powiadomienia, nie jest gwarantowana. Mo\u017ce to prowadzi\u0107 do niezgodnego stanu, je\u015bli obserwatorzy wzajemnie na sobie zale\u017c\u0105.<\/td>\n<\/tr>\n<tr>\n<td><strong>Nadmiar wydajno\u015bci<\/strong><\/td>\n<td>Powiadamianie du\u017cej liczby obserwator\u00f3w mo\u017ce by\u0107 kosztowne, je\u015bli logika aktualizacji jest skomplikowana.<\/td>\n<\/tr>\n<tr>\n<td><strong>Wycieki pami\u0119ci<\/strong><\/td>\n<td>Je\u015bli obserwatorzy nie s\u0105 odpowiednio od\u0142\u0105czane, mog\u0105 nadal istnie\u0107 w pami\u0119ci, nawet je\u015bli nie s\u0105 ju\u017c potrzebne.<\/td>\n<\/tr>\n<\/table>\n<h2>\ud83d\udcc2 Praktyczne scenariusze zastosowania<\/h2>\n<p>Cho\u0107 teoria jest poprawna, praktyczne zastosowanie wymaga kontekstu. Oto konkretne scenariusze, w kt\u00f3rych wzorzec Obserwatora przynosi istotn\u0105 warto\u015b\u0107.<\/p>\n<h3>1. Aktualizacje interfejsu u\u017cytkownika<\/h3>\n<p>W interfejsach graficznych model danych cz\u0119sto musi odzwierciedla\u0107 zmiany w widoku. Je\u015bli u\u017cytkownik edytuje warto\u015b\u0107 w polu tekstowym, etykieta wy\u015bwietlaj\u0105ca t\u0119 warto\u015b\u0107 musi zosta\u0107 zaktualizowana. Je\u015bli etykieta, stan przycisku i komunikat weryfikacji wszystkie musz\u0105 zosta\u0107 zaktualizowane, wzorzec Obserwatora pozwala modelowi rozg\u0142asza\u0107 zmian\u0119 bez wiedzy o komponentach interfejsu u\u017cytkownika.<\/p>\n<h3>2. Systemy sterowane zdarzeniami<\/h3>\n<p>Systemy przetwarzaj\u0105ce zdarzenia, takie jak rejestrowanie lub monitorowanie, korzystaj\u0105 z tego wzorca. Gdy wyst\u0119puje konkretne zdarzenie (np. naruszenie bezpiecze\u0144stwa), wiele podsystem\u00f3w mo\u017ce wymaga\u0107 reakcji (np. wys\u0142anie ostrze\u017cenia, zapis incydentu, zablokowanie konta). Wzorzec Obserwatora zapewnia, \u017ce te reakcje zachodz\u0105 automatycznie, bez tworzenia kodu z twardej logiki reakcji w module bezpiecze\u0144stwa.<\/p>\n<h3>3. Synchronizacja danych<\/h3>\n<p>W systemach rozproszonych kluczowe jest zapewnienie sp\u00f3jno\u015bci danych. Je\u015bli podstawowa baza danych zostanie zaktualizowana, pomocnicze pami\u0119ci podr\u0119czne lub kopie do odczytu musz\u0105 zosta\u0107 od\u015bwie\u017cone. Obserwatorzy mog\u0105 nas\u0142uchiwa\u0107 zdarzenia zatwierdzenia i wyzwala\u0107 proces synchronizacji, utrzymuj\u0105c sp\u00f3jno\u015b\u0107 systemu bez \u015bcis\u0142ej integracji.<\/p>\n<h3>4. Us\u0142ugi powiadamiania<\/h3>\n<p>Aplikacje wysy\u0142aj\u0105ce e-maile, powiadomienia push lub wiadomo\u015bci SMS cz\u0119sto wykorzystuj\u0105 ten wzorzec. Gdy zmienia si\u0119 status u\u017cytkownika, system mo\u017ce powiadomi\u0107 us\u0142ug\u0119 e-mail, us\u0142ug\u0119 push oraz wewn\u0119trzn\u0105 rejestracj\u0119 audytu. Wszystkie te us\u0142ugi s\u0105 roz\u0142\u0105czone od podstawowej logiki u\u017cytkownika.<\/p>\n<h2>\u26a0\ufe0f Powszechne pu\u0142apki i rozwi\u0105zania<\/h2>\n<p>Nawet przy jasnym wzorcu b\u0142\u0119dy implementacji mog\u0105 prowadzi\u0107 do niestabilno\u015bci systemu. Poni\u017cej znajduj\u0105 si\u0119 typowe problemy i sposoby ich ograniczenia.<\/p>\n<h3>1. Zale\u017cno\u015bci cykliczne<\/h3>\n<p>Mo\u017cliwe jest, \u017ce dwa obserwatory b\u0119d\u0105 na siebie zale\u017ca\u0142y. Je\u015bli obserwator A aktualizuje obserwatora B, a obserwator B aktualizuje obserwatora A, mo\u017ce wyst\u0105pi\u0107 cykliczna p\u0119tla odwo\u0142a\u0144. Mo\u017ce to prowadzi\u0107 do b\u0142\u0119d\u00f3w przepe\u0142nienia stosu lub niesko\u0144czonych p\u0119tli.<\/p>\n<ul>\n<li><strong>Rozwi\u0105zanie:<\/strong> Upewnij si\u0119, \u017ce logika powiadamiania nie wywo\u0142uje zmian stanu, kt\u00f3re wymagaj\u0105 ponownej aktualizacji oryginalnego obserwatora. U\u017cywaj flag do \u015bledzenia stanu przetwarzania.<\/li>\n<\/ul>\n<h3>2. Wycieki pami\u0119ci<\/h3>\n<p>W j\u0119zykach z automatycznym zwalnianiem pami\u0119ci, je\u015bli ConcreteObserver przechowuje referencj\u0119 do Subject, a Subject przechowuje referencj\u0119 do obserwatora, \u017caden z nich nie mo\u017ce zosta\u0107 zlikwidowany, je\u015bli nie zostan\u0105 jawnie usuni\u0119te.<\/p>\n<ul>\n<li><strong>Rozwi\u0105zanie:<\/strong> Zawsze zapewnij metod\u0119 <code>od\u0142\u0105cz<\/code> metod\u0119. Upewnij si\u0119, \u017ce gdy obserwator jest niszczone, sam si\u0119 usuwa z listy Subject.<\/li>\n<\/ul>\n<h3>3. Kolejno\u015b\u0107 powiadomie\u0144<\/h3>\n<p>Wzorzec nie gwarantuje kolejno\u015bci powiadomie\u0144 obserwator\u00f3w. Je\u015bli obserwator B zale\u017cy od tego, by obserwator A zosta\u0142 najpierw zaktualizowany, system mo\u017ce zachowywa\u0107 si\u0119 nieprzewidywalnie.<\/p>\n<ul>\n<li><strong>Rozwi\u0105zanie:<\/strong> Je\u015bli kolejno\u015b\u0107 ma znaczenie, rozwa\u017c wariant takiego jak \u0141a\u0144cuch Odpowiedzialno\u015bci lub upewnij si\u0119, \u017ce Podmiot zarz\u0105dza konkretn\u0105 list\u0105 kolejno\u015bci. Alternatywnie zaprojektuj obserwator\u00f3w jako bezstanowych lub samodzielnych pod wzgl\u0119dem danych aktualizacji.<\/li>\n<\/ul>\n<h3>4. Zawieszenia wydajno\u015bci<\/h3>\n<p>Powiadamianie setek obserwator\u00f3w przy ka\u017cdej zmianie stanu mo\u017ce znacznie spowolni\u0107 dzia\u0142anie aplikacji.<\/p>\n<ul>\n<li><strong>Rozwi\u0105zanie:<\/strong> Zaimplementuj grupowanie. Zamiast powiadamia\u0107 przy ka\u017cdej drobnej zmianie, zbieraj zmiany i powiadamiaj raz na parti\u0119. Albo u\u017cyj strategii op\u00f3\u017anionego obliczania, w kt\u00f3rej obserwatorzy aktualizuj\u0105 si\u0119 tylko wtedy, gdy s\u0105 jawnie poproszeni.<\/li>\n<\/ul>\n<h2>\ud83d\udd04 Powi\u0105zane wzorce i ich warianty<\/h2>\n<p>Wzorzec Obserwatora nie jest poj\u0119ciem izolowanym. Istnieje razem z innymi wzorcami rozwi\u0105zywaj\u0105cymi podobne problemy, ale z r\u00f3\u017cnymi kompromisami.<\/p>\n<h3>1. Wzorzec Publikacja-Subskrypcja<\/h3>\n<p>Jest to wariant wzorca Obserwatora, kt\u00f3ry wprowadza po\u015brednika znanego jako Broker Komunikat\u00f3w lub Bus Zdarze\u0144. Podmioty publikuj\u0105 zdarzenia do brokera, a obserwatorzy subskrybuj\u0105 tematy na brokerze. Dzi\u0119ki temu Podmiot i Obserwator s\u0105 jeszcze bardziej roz\u0142\u0105czone, poniewa\u017c nie wiedz\u0105 o istnieniu drugiego. Jest to idealne dla system\u00f3w rozproszonych.<\/p>\n<h3>2. Wzorzec Mediator<\/h3>\n<p>Wzorzec Mediator centralizuje komunikacj\u0119 mi\u0119dzy obiektami. Podczas gdy Obserwator rozprowadza powiadomienia, Mediator hermetyzuje interakcje. U\u017cywaj Mediatora, gdy relacja mi\u0119dzy obiektami jest skomplikowana i wielu do wielu, a nie jedno do wielu.<\/p>\n<h3>3. Bus Zdarze\u0144<\/h3>\n<p>Podobnie jak Publikacja-Subskrypcja, Bus Zdarze\u0144 jest cz\u0119sto implementowany jako obiekt singleton, kt\u00f3ry zarz\u0105dza rejestracj\u0105 zdarze\u0144. Jest szeroko stosowany w nowoczesnych frameworkach do roz\u0142\u0105czenia modu\u0142\u00f3w, kt\u00f3re nie powinny komunikowa\u0107 si\u0119 bezpo\u015brednio.<\/p>\n<h2>\ud83d\udee1\ufe0f Najlepsze praktyki utrzymania<\/h2>\n<p>Aby zachowa\u0107 stabilno\u015b\u0107 implementacji w czasie, post\u0119puj zgodnie z tymi wytycznymi.<\/p>\n<ul>\n<li><strong>Utrzymuj interfejs prostym:<\/strong> Metoda <code>update<\/code> powinna otrzymywa\u0107 dane potrzebne do aktualizacji, a nie odniesienie do Podmiotu. Zapobiega to temu, by obserwatorzy pobierali stan wewn\u0119trzny Podmiotu, co ponownie wprowadza sprz\u0119\u017cenie.<\/li>\n<li><strong>Obs\u0142uguj wyj\u0105tki delikatnie:<\/strong> Je\u015bli jeden z obserwator\u00f3w rzuci wyj\u0105tek podczas wywo\u0142ania <code>update<\/code> wywo\u0142ania, nie powinien on spowodowa\u0107 awarii p\u0119tli powiadamiania dla pozosta\u0142ych obserwator\u00f3w. Obejmij wywo\u0142ania update blokami try-catch.<\/li>\n<li><strong>U\u017cywaj s\u0142abych odniesie\u0144:<\/strong> W niekt\u00f3rych \u015brodowiskach u\u017cywanie s\u0142abych odniesie\u0144 do przechowywania obserwator\u00f3w mo\u017ce automatycznie zapobiega\u0107 wyciekom pami\u0119ci, gdy obserwator zostanie oczyszczony przez mechanizm zbierania \u015bmieci.<\/li>\n<li><strong>Unikaj ci\u0119\u017ckiego kodu:<\/strong> Proces powiadamiania powinien by\u0107 lekki. Przenie\u015b ci\u0119\u017ckie przetwarzanie do w\u0105tk\u00f3w asynchronicznych lub zada\u0144 w tle, aby utrzyma\u0107 podmiot reaktywny.<\/li>\n<li><strong>Dokumentuj zale\u017cno\u015bci:<\/strong> Cho\u0107 kod jest roz\u0142\u0105czony, zale\u017cno\u015bci logiczne nadal istniej\u0105. Dokumentuj, kt\u00f3rzy obserwatorzy s\u0105 oczekiwani do obs\u0142ugi okre\u015blonych zdarze\u0144, aby wspom\u00f3c przysz\u0142ych programist\u00f3w.<\/li>\n<\/ul>\n<h2>\ud83d\udcdd Podsumowanie kluczowych wniosk\u00f3w<\/h2>\n<p>Wzorzec Obserwatora jest fundamentem wsp\u00f3\u0142czesnego projektowania obiektowego. Zapewnia strukturalny spos\u00f3b radzenia sobie z dynamicznymi zale\u017cno\u015bciami mi\u0119dzy obiektami. Oddzielaj\u0105c Podmiot od Obserwator\u00f3w, tworzysz system \u0142atwiejszy do rozszerzania, testowania i utrzymania. Jednak wprowadza z\u0142o\u017cono\u015b\u0107 dotycz\u0105c\u0105 kolejno\u015bci powiadomie\u0144 i wydajno\u015bci. U\u017cywaj go, gdy chcesz roz\u0142\u0105czy\u0107 zmiany stanu od reakcji. Unikaj go, gdy relacja jest statyczna lub gdy wydajno\u015b\u0107 jest krytyczna, a narzut powiadomie\u0144 nie mo\u017ce by\u0107 zniesiony.<\/p>\n<p>Wdro\u017cenie tego wzorca wymaga dyscypliny. Musisz \u015bci\u015ble przestrzega\u0107 umowy interfejsu i zarz\u0105dza\u0107 cyklem \u017cycia subskrypcji. Gdy zrobisz to poprawnie, przekszta\u0142ca on kod z sztywnego w elastyczny ekosystem, w kt\u00f3rym komponenty mog\u0105 si\u0119 niezale\u017cnie rozwija\u0107. Ta elastyczno\u015b\u0107 jest esencj\u0105 solidnej in\u017cynierii oprogramowania.<\/p>\n<p>Podczas projektowania swojego nast\u0119pnego systemu rozwa\u017c, gdzie istnieje silne sprz\u0119\u017cenie. Zidentyfikuj miejsca, w kt\u00f3rych jedna zmiana rozchodzi si\u0119 po ca\u0142ym kodzie. Zastosuj wzorzec Obserwatora w tych obszarach, aby odizolowa\u0107 logik\u0119 j\u0105dra od kwestii peripheralznych. Ten podej\u015bcie prowadzi do czystszej architektury i bardziej odpornych aplikacji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na tle analizy i projektowania obiektowego (OOAD) jednym z najtrwalszych wyzwa\u0144, z jakimi musz\u0105 si\u0119 zmierzy\u0107 deweloperzy, jest zarz\u0105dzanie zale\u017cno\u015bciami mi\u0119dzy sk\u0142adnikami. Gdy obiekty zbyt du\u017co wiedz\u0105 o sobie nawzajem,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3461,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_title":"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD","_yoast_wpseo_metadesc":"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.","fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[105],"tags":[103,104],"class_list":["post-3460","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-object-oriented-analysis-and-design","tag-academic","tag-object-oriented-analysis-and-design"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD<\/title>\n<meta name=\"description\" content=\"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD\" \/>\n<meta property=\"og:description\" content=\"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\" \/>\n<meta property=\"og:site_name\" content=\"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-26T06:18:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1664\" \/>\n\t<meta property=\"og:image:height\" content=\"928\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"vpadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"vpadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\"},\"author\":{\"name\":\"vpadmin\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/c083cc17ddd91b7201d38579fe36292d\"},\"headline\":\"Przewodnik OOAD: Zastosowanie wzorca obserwatora do osi\u0105gni\u0119cia roz\u0142\u0105czno\u015bci\",\"datePublished\":\"2026-03-26T06:18:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\"},\"wordCount\":2019,\"publisher\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\",\"keywords\":[\"academic\",\"object-oriented analysis and design\"],\"articleSection\":[\"Object-Oriented Analysis and Design\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\",\"url\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\",\"name\":\"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD\",\"isPartOf\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\",\"datePublished\":\"2026-03-26T06:18:56+00:00\",\"description\":\"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage\",\"url\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\",\"contentUrl\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg\",\"width\":1664,\"height\":928},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.go2posts.com\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Przewodnik OOAD: Zastosowanie wzorca obserwatora do osi\u0105gni\u0119cia roz\u0142\u0105czno\u015bci\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#website\",\"url\":\"https:\/\/www.go2posts.com\/pl\/\",\"name\":\"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.go2posts.com\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#organization\",\"name\":\"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends\",\"url\":\"https:\/\/www.go2posts.com\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2025\/01\/logo.png\",\"contentUrl\":\"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2025\/01\/logo.png\",\"width\":341,\"height\":46,\"caption\":\"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends\"},\"image\":{\"@id\":\"https:\/\/www.go2posts.com\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/c083cc17ddd91b7201d38579fe36292d\",\"name\":\"vpadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/56e0eb902506d9cea7c7e209205383146b8e81c0ef2eff693d9d5e0276b3d7e3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/56e0eb902506d9cea7c7e209205383146b8e81c0ef2eff693d9d5e0276b3d7e3?s=96&d=mm&r=g\",\"caption\":\"vpadmin\"},\"sameAs\":[\"https:\/\/www.go2posts.com\"],\"url\":\"https:\/\/www.go2posts.com\/pl\/author\/vpadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD","description":"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/","og_locale":"pl_PL","og_type":"article","og_title":"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD","og_description":"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.","og_url":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/","og_site_name":"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends","article_published_time":"2026-03-26T06:18:56+00:00","og_image":[{"width":1664,"height":928,"url":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg","type":"image\/jpeg"}],"author":"vpadmin","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"vpadmin","Szacowany czas czytania":"10 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#article","isPartOf":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/"},"author":{"name":"vpadmin","@id":"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/c083cc17ddd91b7201d38579fe36292d"},"headline":"Przewodnik OOAD: Zastosowanie wzorca obserwatora do osi\u0105gni\u0119cia roz\u0142\u0105czno\u015bci","datePublished":"2026-03-26T06:18:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/"},"wordCount":2019,"publisher":{"@id":"https:\/\/www.go2posts.com\/pl\/#organization"},"image":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage"},"thumbnailUrl":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg","keywords":["academic","object-oriented analysis and design"],"articleSection":["Object-Oriented Analysis and Design"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/","url":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/","name":"Wzorzec Obserwatora do roz\u0142\u0105czno\u015bci | Przewodnik OOAD","isPartOf":{"@id":"https:\/\/www.go2posts.com\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage"},"image":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage"},"thumbnailUrl":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg","datePublished":"2026-03-26T06:18:56+00:00","description":"Naucz si\u0119, jak stosowa\u0107 wzorzec Obserwatora, aby osi\u0105gn\u0105\u0107 roz\u0142\u0105czno\u015b\u0107 w analizie i projektowaniu obiektowym. Szczeg\u00f3\u0142owy przewodnik dotycz\u0105cy wdro\u017cenia, zalet i pu\u0142apek.","breadcrumb":{"@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#primaryimage","url":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg","contentUrl":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2026\/03\/observer-pattern-infographic-childs-drawing.jpg","width":1664,"height":928},{"@type":"BreadcrumbList","@id":"https:\/\/www.go2posts.com\/pl\/applying-observer-pattern-loose-coupling\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.go2posts.com\/pl\/"},{"@type":"ListItem","position":2,"name":"Przewodnik OOAD: Zastosowanie wzorca obserwatora do osi\u0105gni\u0119cia roz\u0142\u0105czno\u015bci"}]},{"@type":"WebSite","@id":"https:\/\/www.go2posts.com\/pl\/#website","url":"https:\/\/www.go2posts.com\/pl\/","name":"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends","description":"","publisher":{"@id":"https:\/\/www.go2posts.com\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.go2posts.com\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/www.go2posts.com\/pl\/#organization","name":"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends","url":"https:\/\/www.go2posts.com\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.go2posts.com\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2025\/01\/logo.png","contentUrl":"https:\/\/www.go2posts.com\/pl\/wp-content\/uploads\/sites\/23\/2025\/01\/logo.png","width":341,"height":46,"caption":"Go 2 Posts Polish | Breaking Digital News &amp; Software Trends"},"image":{"@id":"https:\/\/www.go2posts.com\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/c083cc17ddd91b7201d38579fe36292d","name":"vpadmin","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.go2posts.com\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/56e0eb902506d9cea7c7e209205383146b8e81c0ef2eff693d9d5e0276b3d7e3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/56e0eb902506d9cea7c7e209205383146b8e81c0ef2eff693d9d5e0276b3d7e3?s=96&d=mm&r=g","caption":"vpadmin"},"sameAs":["https:\/\/www.go2posts.com"],"url":"https:\/\/www.go2posts.com\/pl\/author\/vpadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/posts\/3460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/comments?post=3460"}],"version-history":[{"count":0,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/posts\/3460\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/media\/3461"}],"wp:attachment":[{"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/media?parent=3460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/categories?post=3460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.go2posts.com\/pl\/wp-json\/wp\/v2\/tags?post=3460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}