適配器模式(Adapter)的目標是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作,其分為類模式及對象模式,結(jié)構(gòu)圖如下:
類模式:

對象模式:

假設現(xiàn)在我們的系統(tǒng)中使用了大量的圖表功能用來統(tǒng)計數(shù)據(jù),圖表都從Chart類派生,并且所有的顯示都調(diào)用Show接口,由于一些原因,我們現(xiàn)在需要使用第三提供的圖表控件(BeautyChart),它只提供了接口給我們,并且其顯示方式改變了,為了使原來的接口與新控件接口一同工作,這時就可提供一個適配器,用來將新控件的接口適配成我們所期望的原來的接口,結(jié)構(gòu)圖如下:

實現(xiàn)代碼:
//Chart.h
class Chart
{
public:
virtual ~Chart();
virtual void Show();
protected:
Chart();
};
//Chart.cpp
#include "stdafx.h"
#include "Chart.h"
#include <iostream>
using namespace std;
Chart::Chart()
{
}
Chart::~Chart()
{
}
void Chart::Show()
{
cout << "使用原始方法畫圖表" << endl;
}
//BeautyChart.h
class BeautyChart
{
public:
BeautyChart();
virtual ~BeautyChart();
void DrawChart();
};
//BeautyChart.cpp
#include "stdafx.h"
#include "BeautyChart.h"
#include <iostream>
using namespace std;
BeautyChart::BeautyChart()
{
}
BeautyChart::~BeautyChart()
{
}
void BeautyChart::DrawChart()
{
cout << "使用新的控件畫圖表" << endl;
}
//Adapter.h
#include "Chart.h"
class BeautyChart;
class Adapter : public Chart
{
public:
Adapter();
Adapter(BeautyChart*);
virtual ~Adapter();
void Show();
private:
BeautyChart* m_pBeautyChart;
};
//Adapter.cpp
#include "stdafx.h"
#include "Adapter.h"
#include "BeautyChart.h"
Adapter::Adapter()
{
m_pBeautyChart = NULL;
}
Adapter::Adapter(BeautyChart* pBeautyChart)
{
m_pBeautyChart = pBeautyChart;
}
Adapter::~Adapter()
{
if(m_pBeautyChart != NULL)
{
delete m_pBeautyChart;
m_pBeautyChart = NULL;
}
}
void Adapter::Show()
{
if(m_pBeautyChart != NULL)
{
m_pBeautyChart->DrawChart();
}
else
{
Chart::Show();
}
}
//main.cpp
#include "stdafx.h"
#include "Chart.h"
#include "BeautyChart.h"
#include "Adapter.h"
int main(int argc, char* argv[])
{
Chart* pChart = new Adapter();
pChart->Show();
pChart = new Adapter(new BeautyChart);
pChart->Show();
return 0;
}
最后輸出為:
使用原始方法畫圖表
使用新的控件畫圖表
從輸出可以看出,加入適配器后,既可以用原來的方式畫圖表,又可以用新控件來工作。