[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