设计模式(3)--对象结构(1)--适配器

1. 意图

    将一个类的接口转换成客户希望的另外一个接口。

    适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

2. 三种角色

    目标(Target)、被适配者(Adaptee)、适配器(Adapter)

3. 优点

    3.1 类适配器

      a. Adapter可以重定义Adaptee的部分行为,因为Adapter是它的一个子类。

      b. 仅仅引入了一个对象,不需要额外的指针得到Adaptee。

    3.2 对象适配器 

      a. 允许一个Adapter与多个Adaptee(其本身及它的所有子类)。

4. 缺点

    4.1 类适配器

       a. 一个Adapter只能对应一个Adaptee(不能适配其子类)。

    4.2 对象适配器 

       a. Adapter需要额外的指针得到Adaptee。

       b. 重定义Adaptee的行为比较困难,需要生成Adaptee子类使得Adapter引用这个子类。

5. 相关模式

    5.1 Adapter是改变一个已有对象的接口,而Bridge是将接口和实现分离。

    5.2 Decorator是增强其他对象的功能,但不改变它的接口,且支持递归组合。而Adapter不行。

    5.3 Proxy在不改变它的接口的条件下,为另一个对象定义了一个代理。

6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;

class Target
{
public:
	virtual void Request()
	{
		cout << "Target普通的请求" << endl;
	}
};

class Adaptee
{
public:
	virtual void SpecificalRequest()
	{
		cout << "Adaptee特殊请求" << endl;
	}
};

class ClassAdapter : public Target, public Adaptee
{
public:
	virtual void Request()
	{
		SpecificalRequest();
		Target::Request();
	}
};

class ObjectAdapter : public  Target
{
private:
	Adaptee* m_pAdaptee;
public:
	virtual void Request()
	{
		m_pAdaptee->SpecificalRequest();
		Target::Request();
	}
	ObjectAdapter()
	{
		m_pAdaptee = new Adaptee();
	}
	~ObjectAdapter()
	{
		delete m_pAdaptee;
	}
};
#include "Target.h"
int main() {

	ClassAdapter* pClassAdapter = new ClassAdapter;
	pClassAdapter->Request();

	ObjectAdapter* pObjectAdapter = new ObjectAdapter;
	pObjectAdapter->Request();

	delete pClassAdapter;
	delete pObjectAdapter;

	return 0;
}

运行结果:

6.1 类适配器ClassAdapter可以重新实现SpecificalRequest(3.1.a)

6.2 对象适配器ObjectAdapter不需要修改代码,就可以对Adaptee的子类同样适配(3.2.a)

相关推荐

  1. 设计模式_结构模式_适配器模式

    2023-12-16 05:48:02       31 阅读
  2. 设计模式结构模式适配器模式

    2023-12-16 05:48:02       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 05:48:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 05:48:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 05:48:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 05:48:02       18 阅读

热门阅读

  1. 「CocoaPods」Podfile文件模板

    2023-12-16 05:48:02       44 阅读
  2. MySQL DQL

    MySQL DQL

    2023-12-16 05:48:02      37 阅读
  3. 【C#】Microsoft C# 之 LINQ 查询语法视频学习总结

    2023-12-16 05:48:02       30 阅读
  4. React Hooks学习指北

    2023-12-16 05:48:02       34 阅读
  5. 下载文件 后端返回给前端 response header 响应头

    2023-12-16 05:48:02       44 阅读
  6. Vue3+Ts项目——登录页面跳转到首页

    2023-12-16 05:48:02       40 阅读
  7. 7.3 lambda函数

    2023-12-16 05:48:02       35 阅读
  8. 快速入门HTML

    2023-12-16 05:48:02       31 阅读
  9. Mysql和Oracle的区别

    2023-12-16 05:48:02       32 阅读
  10. 【Rust日报】2023-12-14 Mojo 也要支持生存期

    2023-12-16 05:48:02       38 阅读
  11. QT之QGraphicsProxyWidget

    2023-12-16 05:48:02       30 阅读