橋接模式的意圖是將抽象部分與實現部分分離,使它們都可以獨立的變化。
先附上其結構圖:

以一個日志記錄工具這個例子來說明Bridge模式,現在我們要開發一個通用的日志記錄工具,它支持數據庫記錄DatabaseLog和文本文件記錄FileLog兩種方式,同時它既可以運行在.NET平臺,也可以運行在Java平臺上。
我們把日志記錄方式和不同平臺上的實現分別當作兩個獨立的部分來對待,Log及ImpLog,Log是日志記錄方式,ImpLog是日志記錄在不同平臺的實現的基類,結構圖如下:

實現代碼:
//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 << "數據庫日志:";
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;
}
最后輸出為:
數據庫日志:在.NET下寫日志
文本日志:在.NET下寫日志
數據庫日志:在Java下寫日志
文本日志:在Java下寫日志
更詳細信息請參考:
http://terrylee.cnblogs.com/archive/2006/02/24/336652.html