#include #include #include using namespace std; class AbstractLogger { public: static const int INFO = 1; static const int DEBUG = 2; static const int ERROR = 3; AbstractLogger() { nextLogger = nullptr; } virtual ~AbstractLogger(){} void setNextLogger(AbstractLogger *next) { nextLogger = next; } void logMessage(int level, string message) { if(this->level <= level) { write(message); } else { assert(nextLogger != nullptr); nextLogger->write(message); } } virtual void write(string message) = 0; protected: int level; AbstractLogger *nextLogger; }; class ConsoleLogger: public AbstractLogger { public: ConsoleLogger(int level) { this->level = level; cout << "init ConsoleLogger" << endl; } void write(string message) { cout << "Standard Console::Logger: " + message << endl; } }; class ErrorLogger: public AbstractLogger { public: ErrorLogger(int level) { this->level = level; cout << "init ErrorLogger" << endl; } void write(string message) { cout << "Error Console::Logger: " + message << endl; } }; class FileLogger: public AbstractLogger { public: FileLogger(int level) { this->level = level; cout << "init FileLogger" << endl; } void write(string message) { cout << "File::Logger: " + message << endl; } };