class AbstractLogger
{
public:
enum Level
{
INFO,
DEBUG,
ERROR
};
AbstractLogger (AbstractLogger *pNextLogger){m_pNextLogger=pNextLogger;}
virtual~AbstractLogger (){}
virtual void HandleRequset()=0;
virtual void SetHander(AbstractLogger *pNextLogger){m_pNextLogger=pNextLogger;}
protected:
AbstractLogger *m_pNextLogger;
Level m_level;
};
class ConsoleLogger :public AbstractLogger
{
public:
ConsoleLogger(AbstractLogger *pNextLogger=nullptr):AbstractLogger(pNextLogger){this->m_level=INFO;}
~ConsoleLogger(){};
void HandleRequset(){if(m_pNextLogger){m_pNextLogger->HandleRequset();}else {printf("this is ConsoleLogger HandleRequset\n");}}
};
class ErrorLogger :public AbstractLogger
{
public:
ErrorLogger (AbstractLogger *pNextLogger=nullptr):AbstractLogger(pNextLogger){this->m_level=ERROR;}
~ErrorLogger (){};
void HandleRequset(){if(m_pNextLogger){m_pNextLogger->HandleRequset();}else {printf("this is ErrorLogger HandleRequset\n");}}
};
class FileLogger :public AbstractLogger
{
public:
FileLogger (AbstractLogger *pNextLogger=nullptr):AbstractLogger(pNextLogger){this->m_level=DEBUG;}
~FileLogger (){};
void HandleRequset(){if(m_pNextLogger){m_pNextLogger->HandleRequset();}else {printf("this is FileLogger HandleRequset\n");}}
};
int _tmain(int argc, _TCHAR* argv[])
{
ConsoleLogger cl;
ErrorLogger el;
FileLogger fl;
cl.HandleRequset();
cl.SetHander(&el);
cl.HandleRequset();
el.HandleRequset();
el.SetHander(&fl);
el.HandleRequset();
fl.HandleRequset();
getchar();
return 0;
}
转载于:https://my.oschina.net/u/221120/blog/890254