class AbstractLogger:
INFO: int = 1
DEBUG: int = 2
ERROR: int = 3
level: int
nextLogger: 'AbstractLogger' = None
def setNextLogger(self, nextLogger: 'AbstractLogger'):
self.nextLogger = nextLogger
def logMessage(self, level: int, message: str):
if self.level <= level:
self.write(message)
if self.nextLogger != None:
self.nextLogger.logMessage(level, message)
@abstractmethod
def write(self, message: str):
raise NotImplemented
class ConsoleLogger(AbstractLogger):
def __init__(self, level: int):
self.level = level
def write(self, message: str):
print(f'Standard Console::Logger: {message}')
class ErrorLogger(AbstractLogger):
def __init__(self, level: int):
self.level = level
def write(self, message: str):
print(f'Error Console::Logger: {message}')
class FileLogger(AbstractLogger):
def __init__(self, level: int):
self.level = level
def write(self, message: str):
print(f'File::Logger: {message}')
class ChainPatternDemo:
def getChainOfLoggers(self) -> AbstractLogger:
errorLogger: AbstractLogger = ErrorLogger(AbstractLogger.ERROR)
fileLogger: AbstractLogger = FileLogger(AbstractLogger.DEBUG)
consoleLogger: AbstractLogger = ConsoleLogger(AbstractLogger.INFO)
errorLogger.setNextLogger(fileLogger)
fileLogger.setNextLogger(consoleLogger)
return errorLogger
def __init__(self):
loggerChain: AbstractLogger = self.getChainOfLoggers()
loggerChain.logMessage(AbstractLogger.INFO, 'This is an information.')
loggerChain.logMessage(AbstractLogger.DEBUG, 'This is a debug level information.')
loggerChain.logMessage(AbstractLogger.ERROR, 'This is an error information.')
if __name__ == '__main__':
ChainPatternDemo()
Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.