適配器模式
將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
角色和職責(zé)
請求者(client):客戶端角色,需要使用適配器的對象,不需要關(guān)心適配器內(nèi)部的實現(xiàn),只對接目標(biāo)角色。
目標(biāo)角色(Target):目標(biāo)角色,和client直接對接,定義了client需要用到的接口。
這是客戶所期待的接口。目標(biāo)可角色以是具體的或抽象的類,也可以是接口。
源角色(Adaptee):源角色, 需要被進行適配的對象。也叫源對象。
適配器角色(Adapter):適配器角色 適配器,負(fù)責(zé)將源對象轉(zhuǎn)化,給client做適配。
通過在內(nèi)部包裝一個源對象(Adaptee),把源接口轉(zhuǎn)換成目標(biāo)接口。
這四個角色是保證這個設(shè)計模式運行的關(guān)鍵。
代碼演示
源角色
:
//源角色
class MyPrint
{
public:
void operator()(int v1, int v2){//重載operator()
cout << v1 + v2 << endl;
}
};
目標(biāo)角色
:
//目標(biāo)角色
class Target
{
public:
virtual void operator()(int v) = 0;
virtual ~Target(){};
};
適配器角色
:
//適配器角色
class Adapter : public Target
{
public:
Adapter(int param){
this->param = param;
};
void operator()(int v) {
myPrint(v,param);
}
private:
MyPrint myPrint;
int param;
};
客戶角色
:
//client
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
vector<int> v;
for(int i=0;i<10;i++)
{
v.push_back(i);
}
//for_each(v.begin(),v.end(),MyPrint());//直接傳入源角色對象,不滿足條件,編譯也不會通過
for_each(v.begin(),v.end(),Adapter(12));//傳入適配器,由適配器內(nèi)部來操作。
return 0;
}
使用for_each函數(shù),需引入algorithm頭文件,for_each函數(shù)需要三個參數(shù),
第一個first 是迭代器,指向容器中第一個元素,
第二個last 是迭代器,指向容器中最后一個元素的下一個位置。
第三個fn 是一個可調(diào)用對象(函數(shù)指針、函數(shù)對象或Lambda表達(dá)式),它接受容器中元素的引用作為參數(shù)。
for_each函數(shù)原型:文章來源:http://www.zghlxwxcb.cn/news/detail-799716.html
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
for(;first!=last; ++first;) {
fn (*first);
}
return fn; // or, since C++11: return move(fn);
}
對于不同的函數(shù)調(diào)用,F(xiàn)unction參數(shù)可以表示具有重載的()運算符的類類型。最終,for_ach()代碼將具有一個使用fn()的表達(dá)式。
如果最后的for each()參數(shù)fn是指向函數(shù)的指針,而()調(diào)用該函數(shù)。
如果最后的for each()參數(shù)fn是一個函數(shù)對象(確切的說是函數(shù)對象),則fn將是調(diào)用其重載的operator()運算符的對象。(也是本例中我們使用的)。
for_each 函數(shù) 是一個模板函數(shù),內(nèi)部就是對內(nèi)置的for循環(huán)語句的封裝。基于模板可遍歷符合要求所有容器元素。函數(shù)對象
:重載的operator()運算符的非抽象類,實例化出的對象,可稱為函數(shù)對象??梢韵裾{(diào)用函數(shù)一樣使用函數(shù)對象加([參數(shù)])的方式,會自動調(diào)用重載的operator(),故而稱之為函數(shù)對象。
適配器模式 UML類圖中,客戶端和目標(biāo)角色直接對接。但是我們上面的例子中,for_each()中,傳入的是一個函數(shù)對象。故而直接Client和適配器接觸。文章來源地址http://www.zghlxwxcb.cn/news/detail-799716.html
到了這里,關(guān)于設(shè)計模式-- 3.適配器模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!