概念
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
用vector容器中的for_each()举例子
class MyPrint
{
public:
void operator()(int v1, int v2) { // 这里编译会报错,因为只识别一个参数的
cout << v1 + v2 << endl;
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for_each(v.begin(), v.end(), MyPrint());
return 0;
}
注意:上述代码会报错
原因:仿函数中的形参有两个,而系统只能识别一个。
解决:但是我们的需求就是要两个参数,此时就需要一个适配器。
定义目标函数,我要适配成如下结构的仿函数
class Target
{
public:
virtual void operator()(int v) = 0;
};
适配器如下
// 适配器
class Adapter : public Target
{
public:
virtual void operator()(int v) {
print(100, v); // 调用实际函数
}
public:
MyPrint print;
};
所以使用时直接调用适配器的仿函数就行
for_each(v.begin(), v.end(), Adapter());
目前来说已经实现了一个简单的适配器,但是还需要一些优化,可以让适配参数不那么唯一
// 适配器
class Adapter : public Target
{
public:
Adapter(int v) {
this->param = v;
}
virtual void operator()(int v) {
print(param, v); // 调用实际函数
}
public:
MyPrint print;
int param;
};
最后通过一个函数来返回适配器
Adapter getAdapter(int v) {
return Adapter(v);
}
完整代码如下:
// 遍历仿函数
class MyPrint
{
public:
void operator()(int v1, int v2) { // 这里编译会报错
cout << v1 + v2 << endl;
}
};
// 定义目标函数,我要适配成如下结构的仿函数
class Target
{
public:
virtual void operator()(int v) = 0;
};
// 适配器
class Adapter : public Target
{
public:
Adapter(int v) {
this->param = v;
}
virtual void operator()(int v) {
print(param, v); // 调用实际函数
}
public:
MyPrint print;
int param;
};
Adapter getAdapter(int v) {
return Adapter(v);
}
int main()
{
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for_each(v.begin(), v.end(), getAdapter(10));
return 0;
}