Megfigyelő minta osztálydekorálással

Az előző bejegyzésekben a megfigyelő tervezési mintán (observer design pattern) alapuló alkalmazási példákkal és azok megvalósítási változataival foglalkoztunk. Ezek a klasszikus implementáción alapultak. Ez azt jelenti, hogy a publikáló és feliratkozó, vagy más szóval a megfigyelt és a megfigyelő konkrét osztályok a Publisher, illetve a Subscriber osztályokból örökölték a megfigyelő minta alkalmazásához szükséges képességeket, mint például a feliratkozók nyilvántartásba vétele vagy onnan törlése, és a feliratkozók értesítése a megfigyelt osztályban, illetve az értesítések fogadása a megfigyelő osztályban.

E képességeket a konkrét megfigyelt és megfigyelő osztályok számára más módon is lehet biztosítani. Például az osztályobjektumok dekorálásával. Ebben a bejegyzésben ennek megvalósítását mutatjuk be.

Alább egy megfigyelt (Observable) és egy megfigyelő (Observer) osztály definícióját láthatjuk. Ezek a könnyű értelmezhetőség kedvvért nagyon egyszerűek, csak a minta működéséhez és a tesztelhetőséghez szükséges tartalommal rendelkeznek.

Az Observable lényege itt, hogy állapota megváltozásakor értesítést küldjön a notify_subscribers() metódus meghívásával. Ez a metódus láthatólag nincs definiálva az osztályban, és nem is örökli egy szülőosztálytól. Ezt, valamint a feliratkozók nyilvántartásba vételére vagy onnan való törlésre szolgáló metódusokat a publisher nevű osztálydekorátor biztosítja.

Ami az Observer osztályt illeti, itt definiált az értesítések fogadására szolgáló update() metódus. A subscriber nevű osztálydekorátor most arra szolgál, hogy figyelmeztessen, ha nem lenne az update() definiálva az Observer osztályban, mert az előbb említett notify_subscribers() metódus ezt fogja meghívni.

A publisher és subscriber dekorátorfüggvények definíciói követhetők alább. Mindkettő egy osztályobjektumot fogad, amelyet aztán felruház a szükséges metódusattribútumokkal. Egyik szerkezete sem bonyolult, és a működés megértését a részletes kommentek segítik.

A következő kódsorokban a két osztály használatát, illetve a helyes működés tesztelését láthatjuk. A kommentek itt is segítenek követni, hogy mikor mi történik.

E bejegyzés fókuszában a dekorátorok állnak, ezért a fentiekhez kapcsolódóan a Python tudásépítés lépésről lépésre című e-könyvben az „Osztály vigyázz! – típuslétrehozás osztályokkal” fejezeten felül elsősorban a „Képességfejlesztés – függvénydekorátorok”, valamint az „Osztályok dekorálása” című fejezeteket érdemes átnézni.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.