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 _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
