17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

514<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Une implémentation possible de ce DP est de proposer un objet director qui implémente<br />

une interface de publication, et un objet handler, capable de fonctionner<br />

comme un nœud d’une liste chaînée : il connaît son voisin de droite, mis en place par<br />

le director, et peut lui transmettre le travail.<br />

Chain of responsibility<br />

class Handler(object):<br />

""" classe de base d’un handler """<br />

def __init__(self, next_handler=None):<br />

self._next_handler = next_handler<br />

def __add__(self, next_handler):<br />

""" handler1 + handler2, place handler2 en noeud voisin<br />

et renvoi le handler2 si self._next_handler est pris,<br />

remonte la chaîne.<br />

"""<br />

current_handler = self<br />

while current_handler._next_handler isnot None:<br />

current_handler = current_handler._next_handler<br />

current_handler._next_handler = next_handler<br />

return self<br />

def __call__(self, *args, **kw):<br />

""" Si la classe provoque une exception NotImplementedError,<br />

le prochain noeud est appelé, si il existe, et ainsi de suite<br />

"""<br />

try:<br />

return self._handle(*args, **kw)<br />

except NotImplementedError:<br />

if self._next_handler isnot None:<br />

return self._next_handler(*args, **kw)<br />

else:<br />

raise NotImplementedError<br />

def _handle(self, *args, **kw):<br />

""" méthode à surcharger """<br />

raise NotImplementedError<br />

class Director(object):<br />

""" le director est instancié avec le premier noeud de la chaîne """<br />

def __init__(self, first_handler):<br />

self._first_handler = first_handler<br />

def __call__(self, *args, **kw):<br />

return self._first_handler(*args, **kw)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!