-
適配器模式:一種結(jié)構(gòu)型設(shè)計模式
-
應(yīng)用場景:
類A中想要寫一個很復(fù)雜的新方法,但是該方法已經(jīng)在類B中實現(xiàn)過了符衔,如果重復(fù)寫一次,代碼量會增加很多而且代碼可讀性會降低
舉例:
我國的市電電壓是220V,但很多電器正常工作所需的電壓是5V灾炭。如果為了電器使用而改變市電的電壓夫植,工程會變得很大讹剔,而且不同的電器所需的電壓各不同,配合電器需求而更改市電電壓顯然是不現(xiàn)實的详民,所以電器都會配備一個適配器延欠,將市電的220V轉(zhuǎn)換成自己所需的電壓 -
實現(xiàn)方式:
實現(xiàn)方式有兩種。
第一種沈跨,類適配器由捎,使用多繼承的方式
類A繼承自類B,即可直接調(diào)用類B實現(xiàn)過的方法饿凛,無需重復(fù)寫一次該方法
第二種狞玛,對象適配器,使用組合的方式
類A中增加一個類B的指針涧窒,在類A的新方法中心肪,調(diào)用類B中已實現(xiàn)的方法 -
優(yōu)點:
無需重復(fù)實現(xiàn)與測試新方法,提高了效率 -
缺點:
類適配器模式纠吴,由于多繼承硬鞍,可能會出現(xiàn)二義性
對象適配器模式,如果過多使用適配器模式戴已,會導(dǎo)致代碼閱讀難度增大
以下是類適配器模式的簡單代碼實現(xiàn)
#include <iostream>
using namespace std;
//市電類
class Electricity
{
public:
virtual void Charge()//使用市電進行充電膳凝,輸出驗證電壓的數(shù)值
{
cout << "220V charging..." << endl;
}
};
//適配器類
class Adapter5V
{
public:
void Transfer()//將電壓轉(zhuǎn)換為5V,輸出驗證
{
cout << "5V charging..." << endl;
}
};
//類適配器恭陡,使用多繼承的方式
class ElecWithAdapter5V:public Electricity, Adapter5V
{
public:
virtual void Charge()//重寫充電方法
{
Transfer();//直接調(diào)用適配器電壓轉(zhuǎn)換方法
}
};
主函數(shù)中的使用
#include <iostream>
#include "ClassAdapter.h"
using namespace std;
int main()
{
Electricity* pEle = new Electricity();//如果不使用適配器
pEle->Charge();
Electricity* pEleWithAdapter = new ElecWithAdapter5V();//使用適配器
pEleWithAdapter->Charge();
return 0;
}
控制臺輸出結(jié)果
220V charging...
5V charging...
以下是對象適配器模式的簡單代碼實現(xiàn)
#include <iostream>
using namespace std;
//市電類
class Electricity
{
public:
virtual void Charge()//使用市電進行充電蹬音,輸出驗證電壓的數(shù)值
{
cout << "220V charging..." << endl;
}
};
//適配器類
class Adapter5V
{
public:
void Transfer()//將電壓轉(zhuǎn)換為5V,輸出驗證
{
cout << "5V charging..." << endl;
}
};
//對象適配器
class ElecWithAdapter5V:public Electricity
{
public:
ElecWithAdapter5V():pAdapter(NULL)
{
pAdapter = new Adapter5V();
}
virtual void Charge()//重寫充電方法
{
pAdapter->Transfer();//通過適配器指針休玩,調(diào)用電壓轉(zhuǎn)換方法
}
private:
Adapter5V* pAdapter;
};
主函數(shù)中的使用
#include <iostream>
#include "ObjectAdapter.h"
using namespace std;
int main()
{
Electricity* pEle = new Electricity();//如果不使用適配器
pEle->Charge();
Electricity* pEleWithAdapter = new ElecWithAdapter5V();//使用適配器
pEleWithAdapter->Charge();
return 0;
}
控制臺輸出結(jié)果
220V charging...
5V charging...
如有錯誤著淆,歡迎指正