first init
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""
|
||||
from Thinking in Python, Bruce Eckel
|
||||
https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Observer.html
|
||||
|
||||
(c) Copyright 2008, Creative Commons Attribution-Share Alike 3.0.
|
||||
|
||||
Class support for "observer" pattern.
|
||||
|
||||
The observer class is the base class
|
||||
for all smartcard package observers.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import typing
|
||||
|
||||
from smartcard.Synchronization import Synchronization, synchronize
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
|
||||
|
||||
class Observer:
|
||||
"""Observer"""
|
||||
|
||||
def update(self, observable: Observable, handlers: typing.Any) -> None:
|
||||
"""Called when the observed object is
|
||||
modified. You call an Observable object's
|
||||
notifyObservers method to notify all the
|
||||
object's observers of the change."""
|
||||
|
||||
|
||||
class Observable(Synchronization):
|
||||
"""Observable"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.obs: list[Observer] = []
|
||||
self.changed = 0
|
||||
|
||||
def addObserver(self, observer: Observer) -> None:
|
||||
"""Add an observer"""
|
||||
if observer not in self.obs:
|
||||
self.obs.append(observer)
|
||||
|
||||
def deleteObserver(self, observer: Observer) -> None:
|
||||
"""Remove an observer"""
|
||||
self.obs.remove(observer)
|
||||
|
||||
def notifyObservers(self, handlers: typing.Any = None) -> None:
|
||||
"""If 'changed' indicates that this object
|
||||
has changed, notify all its observers, then
|
||||
call clearChanged(). Each observer has its
|
||||
update() called with two arguments: this
|
||||
observable object and the generic 'handlers'."""
|
||||
|
||||
with self.mutex:
|
||||
if not self.changed:
|
||||
return
|
||||
# Make a copy of the observer list.
|
||||
observers = self.obs.copy()
|
||||
self.changed = 0
|
||||
|
||||
# Update observers
|
||||
for observer in observers:
|
||||
observer.update(self, handlers)
|
||||
|
||||
def deleteObservers(self) -> None:
|
||||
"""Remove all observers"""
|
||||
self.obs = []
|
||||
|
||||
def setChanged(self) -> None:
|
||||
"""Set the change flag"""
|
||||
self.changed = 1
|
||||
|
||||
def clearChanged(self) -> None:
|
||||
"""Clear the change flag"""
|
||||
self.changed = 0
|
||||
|
||||
def hasChanged(self) -> int:
|
||||
"""Somethig has changed?"""
|
||||
return self.changed
|
||||
|
||||
def countObservers(self) -> int:
|
||||
"""Return the number of Observers"""
|
||||
return len(self.obs)
|
||||
|
||||
|
||||
synchronize(
|
||||
Observable,
|
||||
"addObserver deleteObserver deleteObservers "
|
||||
+ "setChanged clearChanged hasChanged "
|
||||
+ "countObservers",
|
||||
)
|
||||
Reference in New Issue
Block a user