bridge模式
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。桥模式的意图是将抽象和实现分开。结构图如下所示:
代码如下:日志系统可以是文本日志也可以采用数据库输出方式,系统平台可以是Qt也可以是Java
#include<QString> class LogAbstract { public: LogAbstract(); virtual ~LogAbstract(); virtual void WriteLog(QString log) = 0; }; #include "logabstract.h" LogAbstract::LogAbstract() { } LogAbstract::~LogAbstract() { } #include<QString> class LogImpt { public: LogImpt(); virtual ~LogImpt(); virtual void ExeLog(QString log) = 0; }; #include "logimpt.h" LogImpt::LogImpt() { } LogImpt::~LogImpt() { } #include"logabstract.h" #include"logimpt.h" class LogTextAbstract { public: LogTextAbstract(LogImpt* logImpt); virtual ~LogTextAbstract(); virtual void WriteLog(QString log); protected: LogImpt* logImpt; }; #include "logtextabstract.h" LogTextAbstract::LogTextAbstract(LogImpt* logImpt) { this->logImpt = logImpt; } LogTextAbstract::~LogTextAbstract() { } void LogTextAbstract::WriteLog(QString log) { logImpt->ExeLog(log); } #include"logimpt.h" class LogQtImpt { public: LogQtImpt(); virtual ~LogQtImpt(); virtual void ExeLog(QString log); }; #include "logqtimpt.h" #include<QDebug> LogQtImpt::LogQtImpt() { } LogQtImpt::~LogQtImpt() { } void LogQtImpt::ExeLog(QString log) { qDebug()<<log; } //如此以来,抽象和实现就可以分开了,使用方式如下 LogImpt *impt = (LogImpt*)(new LogQtImpt()); LogAbstract *abLog = (LogAbstract*)(new LogTextAbstract(impt)); abLog->WriteLog("Hello");