1、引言
說起適配器,大家第一個(gè)想到的可能就是電源適配器。
電源適配器的作用想必同學(xué)們也都清楚,那就是將220伏高電壓轉(zhuǎn)換成想要的5伏至20伏左右穩(wěn)定的低電壓。
從某種程度上講,編程中經(jīng)常提起的適配器模式的原理與上面講到的基本是一致的。
2、什么是適配器模式
用于將一個(gè)類的接口轉(zhuǎn)換成另一個(gè)客戶端所期望的接口形式。
適配器模式使得原本由于接口不兼容而無法一起工作的類可以協(xié)同工作。
通常的話,我們會(huì)在以下幾種場(chǎng)景中使用到它。
- 對(duì)已存在的類庫進(jìn)行封裝和適配,以便能夠與其他新的系統(tǒng)或框架協(xié)同工作。
- 在不修改現(xiàn)有代碼的情況下,適配新的接口規(guī)范。
- 在使用第三方組件時(shí),適配器可以將其接口轉(zhuǎn)換成自定義的接口形式。
- 將多個(gè)類或接口進(jìn)行統(tǒng)一的適配,使得它們之間可以互相替換。
舉個(gè)例子,大家在實(shí)際項(xiàng)目中使用第三方組件時(shí),都會(huì)存在第三方組件設(shè)計(jì)的接口與項(xiàng)目實(shí)際使用的接口不一致,無法直接調(diào)用的情況。
這種場(chǎng)景下,我們通常會(huì)聲明一個(gè)類對(duì)第三方接口進(jìn)行封裝,提供項(xiàng)目需要的接口。
以sqlite為例,sqlite只提供了C風(fēng)格的接口,因此我們可以通過SqliteWrapper類來進(jìn)行C++風(fēng)格的封裝。
class SqliteWrapper {
private:
sqlite3* m_conn;
uint32_t m_retry;
uint32_t m_timeout;
sqlite3_stmt* m_stmt;
std::string errStr;
int errCode;
public:
SqliteWrapper(uint32_t retry, uint32_t timeout);
virtual ~SqliteWrapper() { Close(); }
virtual SQLErr Open(std::string& dbName, std::string& user, std::string& pass,
std::string& port);
virtual SQLErr Close();
virtual SQLErr Begin();
virtual SQLErr Commit();
virtual SQLErr RollBack();
virtual SQLErr PrepareStatement(std::string& sql);
virtual SQLErr Execute();
virtual SQLErr Next();
virtual SQLErr Statement(std::string& sql);
virtual int GetLastError(std::string& err);
void SetLastError(int action, const char* err);
void SetLastError(int action);
void ClearLastError();
};
- 類適配器
通過多重繼承來適配接口。適配器類繼承目標(biāo)接口,并且同時(shí)繼承了需要適配的類或接口。 - 對(duì)象適配器
通過組合關(guān)系來適配接口。適配器類持有適配者對(duì)象,并實(shí)現(xiàn)目標(biāo)接口,將原始接口的調(diào)用委托給適配者對(duì)象。 - 接口適配器(Interface Adapter):
接口適配器也稱為缺省適配器或者抽象適配器。
接口適配器通過定義一個(gè)抽象適配器類,該類實(shí)現(xiàn)了目標(biāo)接口并提供了默認(rèn)空實(shí)現(xiàn)。
其他具體適配器類可以選擇性地覆蓋抽象適配器類的方法來完成適配。
接口適配器主要用于解決目標(biāo)接口較多,但實(shí)際只需要使用其中部分方法的情況。
3、優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn):
1) 提供了一種解耦的方式,使得原本不兼容的類可以獨(dú)立演化。
2)可以復(fù)用已存在的類,實(shí)現(xiàn)了類的復(fù)用。
3)可以在不修改已有代碼的情況下進(jìn)行接口的轉(zhuǎn)換和適配。文章來源:http://www.zghlxwxcb.cn/news/detail-531100.html -
缺點(diǎn):
1)引入適配器類會(huì)增加代碼的復(fù)雜性,使代碼變得難以理解。
2)不適合頻繁變化的接口。如果接口經(jīng)常發(fā)生變化,那么適配器的維護(hù)成本可能會(huì)很高,因?yàn)樾枰粩喔逻m配器以適應(yīng)接口的變化。
3)適配器模式可以彌補(bǔ)接口不匹配的問題,但有時(shí)也可能隱藏了系統(tǒng)設(shè)計(jì)上的問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-531100.html
4、裝飾器與適配器的區(qū)別
裝飾者模式 | 適配器模式 | |
---|---|---|
定義 | 裝飾者和被裝飾者都實(shí)現(xiàn)同一個(gè)接口,主要目的是為了拓展之后依舊保持OOP關(guān)系 | 適配器和被適配者沒有必然的聯(lián)系,通常采用代理的形式進(jìn)行包裝 |
關(guān)系 | 滿足 is-a 的關(guān)系 | 滿足 has-a 的關(guān)系 |
功能 | 注重覆蓋、擴(kuò)展 | 注重兼容、轉(zhuǎn)換 |
設(shè)計(jì) | 前置考慮 | 后置考慮 |
到了這里,關(guān)于設(shè)計(jì)模式——適配器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!