[python] vzor Observer a predavani metody v parametru

Petr Prikryl PrikrylP na skil.cz
Úterý Listopad 14 08:55:44 CET 2006


Na téhle stránce jsem narazil na ukázku z původní 
publikace Design Patterns
http://www.research.ibm.com/designpatterns/example.htm

A řešení najdeš na 
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/131499
včetně demonstračního příkladu. 

Podle mého názoru je zbytečné zavádět class myList a metodu call.
Observer pattern definuje rozhraní zúčastněných tříd, což znamená,
že některé metody mají dohodnuté jméno a význam. Do seznamu
pozorovatelů je zbytečné přidávat odkaz na metodu, když tam
může být uložen přímo odkaz na objekt.

Ondrej Penicka
> pri implementaci vzoru observer jsem narazil na problem s predavanim
> metody vychozi tridy vsech pozorovatelu. Subjekt je trida sledovaneho
> objektu, Observer vzorova trida pro pozorovatele a ConcreteObserver
> priklad pozorovatele. Zadrhel je v tride myList, ktera udrzuje seznam
> pozorovatelu a definuje funkci call, ktera pro kazdou polozku zavola
> predanou funkci (Observer.update). Pri volani predane funkce 
> s objektem
> jako parametr (namisto self) se samozrejme vola funkce Observer.update
> namisto ConcreteObserver.update i kdyz self ukazuje na instanci
> ConcreteObserver.
> 
> class myList:
>    def call(self, function, subject):
>       for item in self.list:
>          function(item, subject);
> 
> class Subjekt:
>    def __init__(self):
>        self.observers = myList
>    def updateAll(self):
>       self.myList.call(Observer.update, self)
> 
> class Observer:
>    def update(self, subjekt):
>       print "virtual Observer method called"
> 
> class ConcreteObserver(Observer):
>    def update(self, subjekt):
>       print "change something"
> 
> Neprilis elegantni reseni je v metode Observer.update volat
> self.update_real()
> 
> class Observer:
>    def update(self, subjekt):
>       self.update_real(subjekt)
> 
> class ConcreteObserver(Observer):
>    def update_real(self, subjekt):
>       print "change something"
> 
> Pravdepodobne je to dusledek toho, ze se v pythonu 
> i trida chova jako objekt. Neni nejake lepsi reseni, 
> aniz bych zasahoval do tridy myList?

pepr


Další informace o konferenci Python