定義
適配器設計模式是一種結構型設計模式,用于將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
適配器模式包括三種形式:類適配器模式、對象適配器模式、接口適配器模式(或又稱作缺省適配器模式)。
類適配器模式是通過繼承來實現適配器功能。當我們要訪問的接口A中沒有我們想要的方法,卻在另一個接口B中發現了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉,這個適配器p要實現我們訪問的接口A,這樣我們就能繼續訪問當前接口A中的方法(雖然它目前不是我們的菜),然后再繼承接口B的實現類BB,這樣我們可以在適配器P中訪問接口B的方法了,這時我們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。
對象適配器模式是通過組合來實現適配器功能。
如需進一步了解適配器設計模式,建議閱讀相關書籍。
實現舉例
當然可以,以下是一個使用C++實現的適配器設計模式的例子:
假設我們有一個現有的類RealAudioStream
,它實現了音頻流數據的讀取和寫入,但是它的接口不符合我們需要的接口AudioStream
。因此,我們需要創建一個適配器類AudioStreamAdapter
,它將RealAudioStream
的接口適配成AudioStream
的接口。
// 現有的類RealAudioStream
class RealAudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 需要適配的接口AudioStream
class AudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 適配器類AudioStreamAdapter,繼承自RealAudioStream和AudioStream
class AudioStreamAdapter : public RealAudioStream, public AudioStream {
public:void open(const char* filename) override {realStream.open(filename);}void close() override {realStream.close();}void read(char* buffer, int size) override {realStream.read(buffer, size);}void write(const char* buffer, int size) override {realStream.write(buffer, size);}
private:RealAudioStream& realStream; // 引用RealAudioStream對象,實現適配功能
};
在上面的例子中,AudioStreamAdapter
類實現了兩個接口RealAudioStream
和AudioStream
,通過成員變量realStream
引用了RealAudioStream
對象,實現了適配功能。這樣,我們就可以使用AudioStreamAdapter
類來適配RealAudioStream
類的接口,使其符合AudioStream
接口的要求。
總結
適配器設計模式的特性:
- 適配器模式是一種結構型設計模式,用于將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
- 適配器模式包括三種形式:類適配器模式、對象適配器模式、接口適配器模式(或又稱作缺省適配器模式)。
- 類適配器模式是通過繼承來實現適配器功能。
- 對象適配器模式是通過組合來實現適配器功能。
- 接口適配器模式是給出一個接口,可以動態選擇實現這個接口的具體類,靈活性非常好。