设计模式:适配器模式 c++实现

文章目录

  • 前言
  • 一、适配器模式的理解
  • 二、c++实现适配器模式
  • 总结
  • 参考


前言

今天复习了适配器模式,主要是有人问我这个设计模式,突然不知道该怎么说了,尴尬!!!


一、适配器模式的理解

适配器模式,说白了就是由于目标接口与已有接口不一致,但是功能相似,只要对目标接口稍作处理(这里的处理就是适配器工作方式)就可以实现目标功能。

我们知道不同国家的电压可能不同,而生产的电器也不是所有电压都能正常工作,总不能针对不同国家的电压生产专门的电器吧,于是电源适配器就产生了,它的作用就是把不同电压变成电器需要的电压,这就是适配器模式的一种应用。

适配器模式一般用于软件开发后期,旧的软件接口已被大量使用,但是新的软件接口功能相同但是接口有差异,无法直接使用,这时如果重新统一接口设计,需要消耗大量的资源(时间、人力、物力),简单的使用一个适配器作为连接新旧接口的中转站就成为首选。

《大话设计模式》中对适配器模式的定义与结构图如下所示:
设计模式:适配器模式 c++实现_第1张图片
设计模式:适配器模式 c++实现_第2张图片

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、c++实现适配器模式

这里举了个不太合适的例子来实现适配器模式:旧的接口,即Adaptee类的一个方法OldRequest(const int value), 只支持int类型参数,现在要定义一个新的接口,实现功能和上述接口相同,只是需要string类型的参数,因此在适配器类Adaptor继承Target类并覆写了Target类中NewRequest(const std::string&)方法,对字符串参数做简单的处理后调用Adaptee类中接口实现目标功能。

这里说的不太合适主要是这个例子没有什么实际意义,纯粹是为了介绍适配器模式而编造的。

#include 
#include 
#include 

class Target
{
public:
	virtual bool NewRequest(const int value)
	{
		std::cout << "Calling new request method!" << std::endl;
		return true;
	}

	virtual ~Target(){}
};

class Adaptee
{
public:
	bool OldRequest(const std::string& strValue)
	{
		std::cout << "Calling old request method!" << std::endl;
		return true;
	}
};

class Adaptor : public Target
{
private:
	std::shared_ptr<Adaptee> m_smartAdaptee;

public:
	Adaptor(std::shared_ptr<Adaptee> adaptee)
	{
		m_smartAdaptee = std::move(adaptee);
	}

	bool NewRequest(const int value)
	{
		std::cout << "I'm new request method" << std::endl;
		std::string strValue = std::to_string(value);
		m_smartAdaptee->OldRequest(strValue);

		return true;
	}
};

int main()
{
	std::shared_ptr<Target> target(new Adaptor(std::make_shared<Adaptee>()));
	target->NewRequest(1);

	system("pause");
	return 0;
}

总结

个人认为,适配器模式对于大型项目的后期维护还是很有用的,但是能避免使用还是要避免,能在前期统一接口就统一接口,能在中期重构就重构。既然能预防,为什么要等病发呢!

参考

《大话设计模式》

你可能感兴趣的:(设计模式,c++)