设计模式学习笔记--适配器模式

Unity设计模式—适配器模式 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。本文从实际游戏开发出发,谈谈如何使用适配器模式 阅读详情

一.简介


今天来学习一下23种设计模式中的适配器模式。说到适配器,可能我们第一个想到的就是电源适配器,没错,适配器模式干的活跟电源适配器是一样的。比如我们日常用电是220V的电压,有些电器可以直接使用,但是有些电器根本不会用这么高的电压,也许只需要几V的电压。而我们要是还想使用的话,就要给它增加一个电源适配器,通过适配器更改电压。适配器模式也是一样,比如我们有一个没有源码的库文件,只有相应的头文件,但是我们仍然想使用这个库类,而使用的接口又与之不符,我们就可以通过适配器模式,将这个库类进行“包装”,通过这个适配器间接地使用库。
下面看一下适配器模式的定义以及适配器模式的UML类图:适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。

二.适配器模式例子


就拿我们之前举的电源适配器的例子吧,我们现在有几个家用电器,都是220V的,然后我们从国外买了个进口货,使用的是110V的电压,要想使用这个东东,我们就需要增加一个电源适配器。好了,废话不多说,上代码:


1.没有适配器的情况


// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;


//国产电器,工作在220V
class ChineseAppliances
{
public:
	virtual void WorkOn220V()
	{
		cout << "220V正常工作" << endl;
	}
};

//外国电器,工作在110V
class ForeignAppliances
{
public:
	virtual void WorkOn110V()
	{
		cout << "110V正常工作" << endl;
	}
};

//国产电器使用接口,我们就理解成插座吧
class ChineseSocket
{
private:
	vector<ChineseAppliances*> m_Socket;
public:
	//接入电器
	void AddAppliances(ChineseAppliances* app)
	{
		m_Socket.push_back(app);
	}
	//开启工作
	void Work()
	{
		for (vector<ChineseAppliances*>::iterator it = m_Socket.begin(); it != m_Socket.end(); ++it)
		{
			(*it)->WorkOn220V();
		}
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	//国产电器容器(就理解成插座吧)
	
	ChineseSocket* chineseSocket = new ChineseSocket();
	ChineseAppliances* chineseTV = new ChineseAppliances();
	ForeignAppliances* foreignTV = new ForeignAppliances();

	//我们有一个国产的插座,可以直接使用国内的电器
	chineseSocket->AddAppliances(chineseTV);
	chineseSocket->Work();

	//然而如果没有电源适配器的话,我们就不能在插座上使用国外电器了
	//换句话说,我们即使可以使用,也不能按照国内的标准来使用,必须额外调用
	//foreignTV->WorkOn110V();



	system("pause");
	

	return 0;
}
结果:
    220V正常工作
请按任意键继续. . .

2.使用了适配器的情况


// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;


//国产电器,工作在220V
class ChineseAppliances
{
public:
	virtual void WorkOn220V()
	{
		cout << "220V正常工作" << endl;
	}
};

//外国电器,工作在110V
class ForeignAppliances
{
public:
	virtual void WorkOn110V()
	{
		cout << "110V正常工作" << endl;
	}
};

//国产电器使用接口,我们就理解成插座吧
class ChineseSocket
{
private:
	vector<ChineseAppliances*> m_Socket;
public:
	//接入电器
	void AddAppliances(ChineseAppliances* app)
	{
		m_Socket.push_back(app);
	}
	//开启工作
	void Work()
	{
		for (vector<ChineseAppliances*>::iterator it = m_Socket.begin(); it != m_Socket.end(); ++it)
		{
			(*it)->WorkOn220V();
		}
	}
};

//电源适配器
class Adapter : public ChineseAppliances
{
private:
	//对象适配器,保存一个需要被适配的对象实例
	ForeignAppliances* m_foreignAppliances;
public:
	Adapter(ForeignAppliances* app)
		:m_foreignAppliances(app)
	{
		cout << "我是适配器!" << endl;
	}
	virtual void WorkOn220V() override
	{
		cout << "通过适配器";
		m_foreignAppliances->WorkOn110V();
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	//国产电器容器(就理解成插座吧)
	
	ChineseSocket* chineseSocket = new ChineseSocket();
	ChineseAppliances* chineseTV = new ChineseAppliances();
	ForeignAppliances* foreignTV = new ForeignAppliances();
	Adapter* adapter = new Adapter(foreignTV);

	//我们有一个国产的插座,可以直接使用国内的电器
	chineseSocket->AddAppliances(chineseTV);
	//有了适配器,我们的外国电器就可以被当做国产电器,插座同志对他们就一视同仁啦
	chineseSocket->AddAppliances(adapter);
	chineseSocket->Work();

	system("pause");
	

	return 0;
}
结果:
我是适配器!
220V正常工作
通过适配器110V正常工作
请按任意键继续. . .
通过上面的两个例子,我们看出,如果没有适配器的话,我们本来是不能通过国产的插座来使用国外的电器的,因为接口不同,国外设计的接口是110V的,而国内的接口是220V的,这是个无法改变的事实,所以我们不能修改两面任意一个接口,只能进行补救,通过一定的办法,将一个的接口进行包装,使之适应另一个接口,就是我们通过Adapter对象间接调用ForeignAppliances类的功能。


三.适配器模式总结


最后,来总结一下适配器模式的优缺点以及使用时机。
优点:
1)可以很好地复用现有的类对象,不需要重复开发,有很好的复用性。
2)修改增加一个新的适配类对象,没有修改原有内容,符合开放-封闭原则。
3) 由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
缺点:
1)适配器模式是一种补偿型的模式,如果可以提前将接口设计得统一的话,完全不需要适配器模式。就好比各国的电压标准不同一样。
使用时机:
正如上面缺点里指出的,如果我们能够提前将接口设计得特别合理,我们完全不需要适配器模式。但是,并不是所有时候我们都可以提前计算好。比如一个项目进展了很久,新增功能时刚好有目前的几个模块可以协作完成这个功能,但是接口不同,我们又不能去改这些模块原有的接口,所以只能通过适配器模式,将其中的一个对象包装起来,间接使用。再者,比如我们使用的一些第三方库,他们的接口跟我们的预想肯定是不同的,要想使用,必须进行相应的封装,这时候我们就可以使用适配器模式啦!
实验7 适配器模式、外观模式与模板方法模式 实验7 适配器模式、外观模式与模板方法模式---Java设计模式 立即下载

相关推荐

unity-23种常见设计模式unity版

总体来说设计模式分为三大类: 创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式:共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

Unity实现适配器模式

例如,你可以使用适配器模式将一个旧的输入系统适配到一个新的输入系统,或者将某种数据格式转换为你的游戏能够理解的数据格式。假设你有一个旧的敌人AI接口,需要适配到新的敌人接口以便协同工作。通过适配器模式,Unity中的接口兼容性问题可以优雅地解决,同时保持代码的复用性和可维护性。如果需要适配多个旧接口,可以创建多个适配器类,或通过组合和多态实现更复杂的适配逻辑。适配器的职责仅限于接口转换,不应承担额外的逻辑,避免引入不必要的复杂性。创建一个测试脚本,使用适配器将旧的敌人AI适配到新的接口。

小宝哥Code的专栏 1386

设计模式--适配器模式java例子

设计模式--适配器模式java例子

Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】

设计模式是指在软件开发中为解决常见问题而总结出的一套可复用的解决方案。这些模式是经过长期实践证明有效的编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的抽象解决方案,它提供了代码结构和模块间交互的一种设计思路,帮助开发者解决特定的设计问题。设计模式的特点:通用性:设计模式针对的是软件开发中常见的设计问题,适用于各种软件工程项目。可复用性:设计模式可以在不同项目和环境下被重复使用,提高代码的可维护性和扩展性。可扩展性:设计模式有助于让代码结构更加灵活,易于扩展和修改。

仙魁XAN 1731

DTW Barycenter Averaging(DBA)——平均序列求法

DBA该算法是用来求序列数据集SS的一致序列(平均序列)。由Franc-ois Petitjean提出的。目前,该方法求得的平均序列是最准确的。 假设一元组为S={s1,s2,⋯,sn}S={s1,s2,\cdots,sn},当SS中的元素为实数时,很容易求的SS的平均值: avg=s1+s2+⋯+snn(1) avg = \dfrac{s1 +s2+\cdots+sn}{n} \qquad\q

光怪陆离 1万+

OpenVPN 新增 windows 客户端

虚拟私人网络(Virtual Private Network,简称VPN)是一种网络技术,它允许用户通过公共网络(如互联网)建立一个安全的连接通道。本文介绍如何添加 windows 客户端。

利昂的技术存档 3763

C# 和Unity 中的适配器模式 详解

系统升级时新旧组件共存集成第三方库统一不同子系统之间的接口明确目标接口和适配者接口通过组合(对象适配器)或继承(类适配器)实现适配保持适配器的单一职责考虑使用工厂模式管理适配器创建。

qq_38358224的博客 970

RI-CLPM vs CLPM:什么时候该用随机截距交叉滞后模型?

本文深入对比了交叉滞后模型(CLPM)与随机截距交叉滞后模型(RI-CLPM)的核心差异与应用场景。RI-CLPM通过分离个体间稳定特质与个体内动态波动,能更纯净地估计变量间的动态因果关系,避免CLPM可能存在的混淆。文章提供了清晰的模型选择决策框架,并辅以Mplus语法示例,帮助研究者根据变量特质稳定性与研究问题,正确选用模型以确保结论的严谨性。

weixin_29276847的博客 302

Unity实现设计模式——适配器模式

适配器模式又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。在一个在役的项目期望在原有接口的基础上拓展,那么适配器模式是最适合的。即需要使用一个已有或新建的类,但这个类又不符合系统的接口,则可以使用适配器模式。client:需要使用适配器的对象,不需要关心适配器内部的实现,只对接目标角色。Target:目标角色,和client直接对接,定义了client需要用到的功能。

zzzsss123333的博客 741

1、符号回归:原理、应用与实践

本文全面介绍了符号回归(Symbolic Regression)的原理、发展历程、核心算法及其在科学与工程领域的广泛应用。文章从基本概念出发,详细阐述了基于遗传编程的符号回归机制,并探讨了其在游艇水动力学、化学过程、锂离子电池、生物医学等多个领域的实际应用。同时,博文还涵盖了高级技术如知识集成、系数优化、预测区间计算及微分方程发现等内容,对比了开源与商业软件工具,并展望了未来发展趋势,旨在为研究人员和从业者提供一本实用的符号回归指南。

ipfs8storage的博客 248

① Django手把手从零开发个人博客-前言

手把手教你从零开始玩转手把手教你从零开始玩转Django,全面学习并了解django的运行机制、开发全流程及线上部署。Django,全面学习并了解django的运行机制、开发全流程及线上部署。 专栏介绍 本套教程遵循Django的设计思想,开门见山,快速切入主题,拒绝拖沓,在实战中学习每一个知识点,提高学习的趣味性以及个人成就感,并且能快速将所学运用到实际项目中。 将从零手把手带着你一步步完成博客的每一个功能,通过实现博客文章列表页、文章详情页、作者页面等功能来学习和了解django的视图查询模块相关知.

轻编程的博客 513

设计模式 - 学习笔记 - 适配器模式AdapterPattern

设计模式 - 学习笔记 - 适配器模式原理分析代码演示电源插座 ElectricalSocket两口插头 PlugUSB公口手机充电器(适配器) ChargerAdapter客户端 AdapterPatternDemo 原理分析 适配器就是:扩展坞、转换器、充电头。 解决的问题就是将一个目标不支持的接口,转变成一个能用的接口。 典型场景就是功能都具备,只是接口对不上。 代码演示 电源插座 ElectricalSocket public class ElectricalSocket{ public vo

灵台方寸山斜月三星洞 605

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

HeadFirst 设计模式学习笔记7--适配器模式和外观模式

本文已搬家至【HeadFirst 设计模式学习笔记】7 适配器模式和外观模式

gnuhpc的专栏 2421

【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南

重新定义了 AI 图像生成的产业标准。它不仅是“平民化的视觉工厂”,更是推动内容生产从“创意试错”转向“精准制造”的关键工具。未来,随着视频生成能力的加入(谷歌计划支持“文字指令 - 动态场景 - 多平台适配”全流程),Nano Banana 有望进一步颠覆影视、广告等领域的创作范式。:批量生成多场景图,模特姿态自然,服装褶皱和材质细节高度一致,节省 90% 拍摄成本。模型的非正式代号,是一款革命性的 AI 图像生成与编辑工具,主打。:生成细节丰富的厨师特写,光影自然,皮肤纹理和刀具反光逼真。

专注:太空算力、AI infra、异构调度、大模型成本工程 886

2.STM32F407ZGT6 学习笔记-移植 FreeRTOS

1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src 和 port 文件夹 (src用于存放freertos源码,port文件夹存放内存和接口相关的文件) 3. 复制freertos/source文件夹下所有c文件复制到刚刚建立的freertos/src目录下 4. 复制FreeRTOSv9.0.0\FreeRTOS\Source\portablex下的MemMang和RVDS文件夹复制到刚刚建立的port问价夹下 5. 将FreeRTOSv9.0.0\FreeRTOS

Car12 1233

设计模式学习笔记十一:适配器模式(Adapter Pattern)

设计模式学习笔记十一:适配器模式(Adapter Pattern)     1.概述     在软件开发中,我们经常会遇到系统间集成,在系统集成时,最常见的问题就是系统间的接口不一致。很多能够满足功能的系统模块,由于接口不一致,导致无法使用。例如,常用的媒体播放器是MS Media player和RealPlayer,他们的文件结构和软件接口完全不同,前者支持WMF格式的音频和

AlbenXie的博客 336

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C#设计模式学习笔记:(6)适配器模式

本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用。 一、引言 从今天开始我们开始讲结构型设计模式,结构型设计模式有如下几种:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 创建型设计模式解决的是对象创建的问题,而结构型设计模式解决的是类和对象组合关系的问题。 今天我们开始讲结构型设计模式里面的第一个设计模式:适配器模式。适配器模式其实很简单,在现实生活中有很多这样的实例实例:比如,手机充电

chinaherolts2008的博客 184

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

学习笔记【23种设计模式-第六节:Adapter Pattern适配器模式】

Adapter Pattern适配器模式 简述: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。 适配器模式属于构造型模式。 主要分为三类:适配器模式、对象适配器模式、接口适配器模式。 工作原理 适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。 从用户的角度看不到被适配者,是解耦的。 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。 用

qq_53273362的博客 156

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

设计模式学习笔记(3)——适配器模式(Adapter Pattern)

一、 目的:将一个类的接口转换成客户希望的另一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。——GoF《Design Pattern》二、 描述:其实个人觉得Adapter模式在所有的模式当中算是比较简单的那种,也比较容易理解,就像我们日常生活中经常会使用USB转换器,将某种非USB接口的外设转换我们本本上

BoBo的代码世界 1186

设计模式学习笔记(七)- --适配器模式

[同系列文章] 1. 设计模式学习笔记(一)- -策略模式 2. 设计模式学习笔记(二)- -观察者模式 3. 设计模式学习笔记(三)- –装饰者模式 4. 设计模式学习笔记(四)- –工厂模式 5. 设计模式学习笔记(五)- –单件模式 6. 设计模式学习笔记(六)- –命令模式相信大家学了这么久,对设计模式都很有感觉了吧,各种封装大法,各种先进成熟可靠的思想有没有吸引住你呢?本

hecate1994的博客 309

设计模式学习笔记——适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 我们通过下面的实例来演示适配器模式的使用。其中,音频...

Stephen 510

设计模式学习笔记之适配器模式

设计模式学习笔记之适配器模式

睿不可挡的专栏 1901
上一篇: 设计模式学习笔记--状态模式
下一篇: UML类图符号
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值