橋接模式的意圖是將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。
先附上其結(jié)構(gòu)圖:

以一個(gè)日志記錄工具這個(gè)例子來(lái)說(shuō)明Bridge模式,現(xiàn)在我們要開(kāi)發(fā)一個(gè)通用的日志記錄工具,它支持?jǐn)?shù)據(jù)庫(kù)記錄DatabaseLog和文本文件記錄FileLog兩種方式,同時(shí)它既可以運(yùn)行在.NET平臺(tái),也可以運(yùn)行在Java平臺(tái)上。
我們把日志記錄方式和不同平臺(tái)上的實(shí)現(xiàn)分別當(dāng)作兩個(gè)獨(dú)立的部分來(lái)對(duì)待,Log及ImpLog,Log是日志記錄方式,ImpLog是日志記錄在不同平臺(tái)的實(shí)現(xiàn)的基類,結(jié)構(gòu)圖如下:

實(shí)現(xiàn)代碼:
//ImpLog.h
class ImpLog
{
public:
virtual ~ImpLog();
virtual void WriteLog() = 0;
protected:
ImpLog();
};
//ImpLog.cpp
#include "stdafx.h"
#include "ImpLog.h"
ImpLog::ImpLog()
{
}
ImpLog::~ImpLog()
{
}
//NImpLog.h
#include "ImpLog.h"
class NImpLog : public ImpLog
{
public:
NImpLog();
virtual ~NImpLog();
void WriteLog();
};
//NImpLog.cpp
#include "stdafx.h"
#include "NImpLog.h"
#include <iostream>
using namespace std;
NImpLog::NImpLog()
{
}
NImpLog::~NImpLog()
{
}
void NImpLog::WriteLog()
{
cout << "在.NET下寫日志" << endl;
}
//JImpLog.h
#include "ImpLog.h"
class JImpLog : public ImpLog
{
public:
JImpLog();
virtual ~JImpLog();
void WriteLog();
};
//JImpLog.cpp
#include "stdafx.h"
#include "JImpLog.h"
#include <iostream>
using namespace std;
JImpLog::JImpLog()
{
}
JImpLog::~JImpLog()
{
}
void JImpLog::WriteLog()
{
cout << "在Java下寫日志" << endl;
}
//Log.h
class ImpLog;
class Log
{
public:
virtual ~Log();
virtual void Write() = 0;
protected:
Log();
};
//Log.cpp
#include "stdafx.h"
#include "Log.h"
Log::Log()
{
}
Log::~Log()
{
}
//DBLog.h
#include "Log.h"
class DBLog : public Log
{
public:
DBLog();
DBLog(ImpLog*);
virtual ~DBLog();
void Write();
private:
ImpLog* m_pImpLog;
};
//DBLog.cpp
#include "stdafx.h"
#include "DBLog.h"
#include "ImpLog.h"
#include <iostream>
using namespace std;
DBLog::DBLog()
{
}
DBLog::DBLog(ImpLog* pImpLog) : m_pImpLog(pImpLog)
{
}
DBLog::~DBLog()
{
if(m_pImpLog != NULL)
{
delete m_pImpLog;
m_pImpLog = NULL;
}
}
void DBLog::Write()
{
cout << "數(shù)據(jù)庫(kù)日志:";
m_pImpLog->WriteLog();
}
//TxtLog.h
#include "Log.h"
class TxtLog : public Log
{
public:
TxtLog();
TxtLog(ImpLog*);
virtual ~TxtLog();
void Write();
private:
ImpLog* m_pImpLog;
};
//TxtLog.cpp
#include "stdafx.h"
#include "TxtLog.h"
#include "ImpLog.h"
#include <iostream>
using namespace std;
TxtLog::TxtLog()
{
}
TxtLog::TxtLog(ImpLog* pImpLog) : m_pImpLog(pImpLog)
{
}
TxtLog::~TxtLog()
{
if(m_pImpLog != NULL)
{
delete m_pImpLog;
m_pImpLog = NULL;
}
}
void TxtLog::Write()
{
cout << "文本日志:";
m_pImpLog->WriteLog();
}
//main.cpp
#include "stdafx.h"
#include "Log.h"
#include "DBLog.h"
#include "TxtLog.h"
#include "ImpLog.h"
#include "NImpLog.h"
#include "JImpLog.h"
int main(int argc, char* argv[])
{
ImpLog* pImp = new NImpLog;
Log* pLog = new DBLog(pImp);
pLog->Write();
pLog = new TxtLog(pImp);
pLog->Write();
pImp = new JImpLog;
pLog = new DBLog(pImp);
pLog->Write();
pLog = new TxtLog(pImp);
pLog->Write();
return 0;
}
最后輸出為:
數(shù)據(jù)庫(kù)日志:在.NET下寫日志
文本日志:在.NET下寫日志
數(shù)據(jù)庫(kù)日志:在Java下寫日志
文本日志:在Java下寫日志
更詳細(xì)信息請(qǐng)參考:
http://terrylee.cnblogs.com/archive/2006/02/24/336652.html