將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
主要內容:
(1)類適配器:
當客戶在接口中定義了他期望的行爲時,我們就可以應用適配器模式,提供一個實現該接口的類,並且擴展已有的類,通過創建子類來實現適配。
(2)對象適配器:
對象適配器”通過組合除了滿足“用戶期待接口”還降低了代碼間的不良耦合。在工作中推薦使用“對象適配”。
(3) 缺省適配器模式
缺省適配器模式是一種特殊的適配器模式,但這個適配器是由一個抽象類實現的,並且在抽象類中要實現目標接口中所規定的所有方法,但很多方法的實現都是“平庸”的實現,也就是說,這些方法都是空方法。而具體的子類都要繼承此抽象類。
本文主要講述類適配器和對象適配器。
解決的問題
即Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。
模式中的角色
(1) 目標接口(Target):客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
(2) 需要適配的類(Adaptee):需要適配的類或適配者類。
(3) 適配器(Adapter):通過包裝一個需要適配的對象,把原接口轉換成目標接口。
類適配器類圖
對象適配器類圖
所以,類適配是通過多重繼承(Adapter繼承於Adaptee和Target類)實現接口適配;而對象適配器,是通過單繼承,即Adapter只繼承於Target,然後,在Adapter類中創建,Adaptee對象,實現了接口適配。
Adaptee.h
#pragma once
#include<iostream>
using namespace std;
class Adaptee
{
public:
// Methods
void SpecificRequest()
{
cout<<"Called SpecificRequest()"<<endl;
}
};
Target.h
#pragma once
class Target
{
public:
// Methods
virtual void Request(){};
};
main.cpp
#include"Adapter.h"
int main()
{
// Create adapter and place a request
Target *t = new Adapter();
t->Request();
return 0;
}
類適配器Adapter類
#pragma once
#include"Adaptee.h"
#include"Target.h"
class Adapter : public Adaptee, public Target
{
public:
// Implements ITarget interface
void Request()
{
// Possibly do some data manipulation
// and then call SpecificRequest
this->SpecificRequest();
}
};
對象適配器Adapter類
"Adapter"
class Adapter : public Target
{
private:
Adaptee *adaptee;
public:
Adapter()
{
adaptee = new Adaptee();
}
// Implements ITarget interface
void Request()
{
// Possibly do some data manipulation
// and then call SpecificRequest
adaptee->SpecificRequest();
}
};