适配器模式 结构性模式之五

1.概念

        适配器模式是一种结构型的软件设计模式,也称包装模式,即将相对复杂的功能(可能用到多个类)封装起来,提供一个使用者想要的接口,使用者只需要调用接口,不需要知道接口里封装的内容是如何实现的。比如在面对一些第三方库或者SDK开发时,它们的接口往往与我们自己想要的接口不一致,此时适配器模式可以很好地扮演一个接口转换器的角色,将别人的接口与我们的接口对应上。

2.优缺点

优点:

  1. 良好封装性。接口内的内容对使用者而言是透明的,即看不见,这确保了内部功能具备较好的封装性,不易被改动。
  2. 解耦。不匹配的两方在适配器的作用下可以做到解耦,不需要修改任何一方原有代码逻辑。
  3. 良好复用性。适配的两方不需要做任何修改,业务的实现可以通过适配器来完成,不同的业务可以使用不同的适配器。
  4. 良好扩展性。若要增加业务场景,只需要增加适配器类,来满足业务即可。

缺点:

  1. 不利于维护。因为业务的实现基于适配器完成,适配器中代码的复杂程度会越来越高,不熟悉业务或者底层逻辑的人难以短时间内接手维护。
  2. 系统结构易混乱。当业务量快速增加时,适配器类的数量也会快速增加,没有良好的系统架构布局,最终会使得整个系统臃肿且危险。      

3.两种适配器类型

  1. 类适配器模式:适配器类通过继承适配者类(多重继承),达到适配目的,部分语言可能不支持多重继承(如C#)。
  2. 对象适配器模式:适配器类中存放适配者类的实例对象,调用它来达到适配目的,该模式较常用。

4.示例代码

4.1 类适配器模式

#pragma once
#include 

using namespace std;

// 巴斯勒相机类(适配者)
class BaslerCamera
{
public:
	// 打开相机
	void openBaslerCamera() {
		cout << "巴斯勒相机:打开相机。" << endl;
	}
	// 关闭相机
	void closeBaslerCamera() {
		cout << "巴斯勒相机:关闭相机。" << endl;
	}
	// 打开曝光设置
	void openExposureSettings() {
		cout << "巴斯勒相机:打开曝光设置。" << endl;
	}
	// 更改相机帧率
	void changeCameraFrame() {
		cout << "巴斯勒相机:更改相机帧率。" << endl;
	}
};

// 相机接口类
class Camera
{
public:
	// 构造函数
	Camera() {};
	// 析构函数
	virtual ~Camera() {};
	// 打开相机
	virtual void openCamera() = 0;
	// 关闭相机
	virtual void closeCamera() = 0;
	// 配置属性
	virtual void setConfig() = 0;
};

// 相机适配器类
class CameraAdapter :public Camera, public BaslerCamera
{
public:
	// 打开相机
	virtual void openCamera() {
		openBaslerCamera();
	}
	// 关闭相机
	virtual void closeCamera() {
		closeBaslerCamera();
	}
	// 配置属性
	virtual void setConfig() {
		// 打开曝光设置
		openExposureSettings();
		// 更改相机帧率
		changeCameraFrame();
	}
};

int main()
{
	Camera* m_camera = new CameraAdapter();
	// 打开相机
	m_camera->openCamera();
	// 配置相机
	m_camera->setConfig();
	// 关闭相机
	m_camera->closeCamera();
	delete m_camera;
	return 0;
}

Camera类的接口使我们实际想要的接口,但是事实上我们拿到的现有的接口BaslerCamera类提供的接口,因此需要CameraAdapter作为类适配器,它同时继承自Camera和BaslerCamera两个类。

4.2 对象类适配器模式

#pragma once
#include 
#include "BaslerCamera.h"
 
using namespace std;
 
// 相机接口类
class Camera
{
public:
	// 构造函数
	Camera() {};
	// 析构函数
	virtual ~Camera() {};
	// 打开相机
	virtual void openCamera() = 0;
	// 关闭相机
	virtual void closeCamera() = 0;
	// 配置属性
	virtual void setConfig() = 0;
};
 
// 相机适配器类
class CameraAdapter :public Camera
{
public:
	// 构造函数
	CameraAdapter() {
		m_baslerCamera = new BaslerCamera();
	}
	// 析构函数
	virtual ~CameraAdapter() {
		if (m_baslerCamera != nullptr) {
			delete m_baslerCamera;
			m_baslerCamera = nullptr;
		}
	}
	// 打开相机
	virtual void openCamera() {
		m_baslerCamera->openBaslerCamera();
	}
	// 关闭相机
	virtual void closeCamera() {
		m_baslerCamera->closeBaslerCamera();
	}
	// 配置属性
	virtual void setConfig() {
		// 打开曝光设置
		m_baslerCamera->openExposureSettings();
		// 更改相机帧率
		m_baslerCamera->changeCameraFrame();
	}
private:
	BaslerCamera *m_baslerCamera;                 // 适配者类实例
};

int main()
{
	Camera* m_camera = new CameraAdapter();
	// 打开相机
	m_camera->openCamera();
	// 配置相机
	m_camera->setConfig();
	// 关闭相机
	m_camera->closeCamera();
	delete m_camera;
	return 0;
}

适配器类做了改变,类中增加了一个适配者类的实例对象,调用的结果同类适配器模式一致。

引用

 

设计模式之适配器模式(C++)_c++适配器模式-CSDN博客

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