【设计模式】04 适配器模式

摘要
  将两种完全不同的事物联系到一起,就像现实生活中的变压器。假设一个手机充电器需要的电压是20V,但是正常的电压是220V,这时候就需要一个变压器,将220V的电压转换成20V的电压,这样,变压器就将20V的电压和手机联系起来了。

  适配器模式就是将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

模式中的角色


目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。

需要适配的类(Adaptee):需要适配的类或适配者类

适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

原文链接:https://blog.csdn.net/WICHER_WU/article/details/104944145

适配器模式 就是将已经写好的接口(但是这个接口不符合要求),转换成目标接口。

 

有这样一个客户端。

//客户端
void test01()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//第三个参数,需要一个参数,传入两个参数就不能用
	//需要将两个参数的转化为一个参数的
	for_each(v.begin(), v.end(), );
}

定义一个vector容器,用for_each进行输出遍历,对于第三个参数,查看for_each的源码

(1)

(2)

(3)

返回值是void,不需要关心。_Func(*_First)只有一个参数。

但是,如果这时,我们已经写好一个函数对象,如下。

//1、函数对象,这个函数我已经写好
struct MyPrint
{
	void operator()(int v1,int v2)
	{
		cout << v1 + v2 << endl;
	}
};

其参数有两个,这就和我们希望的不一样了,需要有一个适配器进行匹配。

那么目标接口应该是这样

//2、转化  定义目标接口,适配成什么样的
class Target
{
public:
	virtual void operator()(int v) = 0;
};

接下来就是写适配器

将我们已经写好的函数对象 适配 成目标接口

//3、写适配器,将1适配成2。调用的还是1
class Adapter :public Target {
public:
	//构造函数
	Adapter(int param)
	{
		this->param = param;
	}
	virtual void operator()(int v)
	{
		myPrint(v, param);
	}

private:
	MyPrint myPrint;
	int param;
};

包装一下这个适配器

Adapter MyBind2nd(int v)
{
	return Adapter(v);
}

最后总的代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//适配器模式 就是将已经写好的接口(但是这个接口不符合要求),转换成目标接口


//1、函数对象,这个函数我已经写好
struct MyPrint
{
	void operator()(int v1,int v2)
	{
		cout << v1 + v2 << endl;
	}
};

//2、转化  定义目标接口,适配成什么样的
class Target
{
public:
	virtual void operator()(int v) = 0;
};

//3、写适配器,将1适配成2。调用的还是1
class Adapter :public Target {
public:
	//构造函数
	Adapter(int param)
	{
		this->param = param;
	}
	virtual void operator()(int v)
	{
		myPrint(v, param);
	}

private:
	MyPrint myPrint;
	int param;
};

//MyBind2nd
Adapter MyBind2nd(int v)
{
	return Adapter(v);
}


//客户端
void test01()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//第三个参数,需要一个参数,传入两个参数就不能用
	//需要将两个参数的转化为一个参数的
	for_each(v.begin(), v.end(), MyBind2nd(10));
}

int main(int argc, int* argv[])
{
	test01();
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值