c++设计模式之适配器模式

前言

在生活中,经常出现因为两个对象的接口不兼容而不能一起工作的情况。例如中国人和美国人进行交流,就需要一个翻译;还有家用的220V电压在给一些电器如手机,电脑等进行充电时就需要电源适配器,还有一台电脑要读取一张sd卡的数据也需要将sd卡先插在读卡器上,再插在电脑上才能读取数据,这些都是因为两个对象之间的接口不兼容,所以需要一个适配者来使他们能够一起工作,在软件设计中依旧如此。当软件设计中出现这种情况,就需要使用适配器模式。接下来简单介绍一下适配器模式。

适配器模式简介

在软件设计中,有时候会遇到在开发某个业务的组件时,而正好该组件又在组件库中已经存在,但是可能因为组件库中的组件与当前接口不兼容,重新再开发一个组件又费时费力,此时,如果开发一个适配器,使组件库中的组件能够兼容当前的接口那真的是省时省力多了。
适配器模式简介:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式有两种,其一是对象适配器,该适配器模式中,适配器和适配者是关联关系;另一种是类适配器, 其适配器和适配者之间是继承关系。在实际项目中,对象适配器用的比较频繁,下面主要描述一下对象适配器。

适配器的模式结构

适配器模式结构的UML类图如下所示:
在这里插入图片描述
从UML类图中可以很清楚的看到,该模式主要包括以下几种角色:
1.目标角色:目标角色定义了客户所需要的接口,通常我们会采用抽象的目标角色,具体的目标角色继承抽象目标角色;
2.适配器角色:适配器的内部就是调用适配者的接口,以达到适配target和adaptee。
3.适配者类:它定义并且实现了客户真正想使用的接口,但是由于接口不兼容,需要适配器来适配,才能让客户使用。

适配器模式实例

接下来,我们来一步步实现适配器模式。
实例场景:有一个中国人想要和英国人对话,于是他需要找一个翻译才可以完成对话。
首先需要一个抽象的目标类:

class People
{
	public:
		virtual void speak() = 0;  
};

上面定义了一个抽象的目标类——人,包含speak的方法。
再定义具体的目标类:

class Chinese:public People
{
	public:
		void speak()
		{
			cout << "chinese: " << endl;
		}
};

具体的目标类是继承自抽象目标类的,这里定义为chinese,也比较好理解。
接下来需要再定义一个适配者,这里取名为English。

class English
{
	public:
		void specifispeak()
		{
			cout << "english" << endl;
		}
};

好了,现在两种人都有了,但是中国人说话,英国人听不懂,所以需要一个适配器即翻译官。

class Adapter:public Chinese
{
	public:
		Adapter()
		{
			adapter = new English();
		}
		~Adapter()
		{
			if(adapter != NULL)
			{
				delete adapter;
				adapter = NULL;
			}
		}
		void speak()
		{
			cout << "Adapter: speak " << endl;
			adapter->specifispeak();
		}
		private:
			English* adapter;
};

可以看到,适配器类里面包含了一个适配者的实例,用来调用适配者类的方法。
好了,现在中国人,英国人和翻译官都了,现在可以开始愉快的交流了。
完整代码如下:

#include <iostream>
using namespace std;
class People
{
	public:
		virtual void speak() = 0;
};
class Chinese:public People
{
	public:
		void speak()
		{
			cout << "chinese: " << endl;
		}
};
class English
{
	public:
		void specifispeak()
		{
			cout << "english" << endl;
		}
};
class Adapter:public Chinese
{
	public:
		Adapter()
		{
			adapter = new English();
		}
		~Adapter()
		{
			if(adapter != NULL)
			{
				delete adapter;
				adapter = NULL;
			}
		}
		void speak()
		{
			cout << "Adapter: speak " << endl;
			adapter->specifispeak();
		}
		private:
			English* adapter;
};
int main()
{
	Chinese *target = new Adapter();
	target->speak();
	delete target;
	return 0;
}

运行结果:
在这里插入图片描述
初步了解适配器模式之后,我们再来总结一下适配器模式的使用场景和优缺点吧。
应用场景:
当我们想要复用一些现存的类但是接口又不兼容时,可以考虑采用适配器模式。
优点:代码重用率高,通过适配器可以无需修改适配者就可以使用原有的适配者类;将目标类和适配者类解耦,解决了两者接口不一致的问题;
客户端可以通过适配器透明的调用目标接口。
缺点:适配器一次只能适配一个适配者,不能适配多个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值