java23种常用设计模式之适配器模式(Adapter)

手把手教你用Matlab/Simulink搭建PMSM的SMO无感FOC仿真(附相位补偿与离散化代码) 本文详细介绍了基于滑模观测器(SMO)的永磁同步电机(PMSM)无传感器FOC控制方法,通过Matlab/Simulink平台实现从理论到实践的完整流程。内容涵盖SMO核心原理、离散化处理、转子位置估算与相位补偿技术,以及双闭环控制系统搭建,为工程师提供了一套完整的无传感器控制解决方案。 阅读详情

适配器模式也是最常用的模式之一,也很简单。

每个笔记本接电源的线上都有一个黑盒子,它就是适配器,无论你是吧电脑接在在220V的电源上还是110V的电源上,通过这个适配器把这些不同的电压转换成电脑需要的36V电压,保证笔记本在一个电压稳定的情况下正常运行。今天我要讲的这个适配器模式也是这个意思。一样的作用,两个不同的接口,有不同的实现,在某一天God说,你要把B接口转化为A接口,What should we do?

继承,确实能解决,但不是明智的选择,而且违背了OCP原则。So……

So 采用适配器模式就能accomplish perfectly。

适配器的通用类图长这个样(从RationalRose 的帮助文档截图的):

 

看完图,大家肯定有个疑惑,这不是就包装模式(Wrapper)吗?Bingo!但是包装模式可不止一个,装饰模式也是包装模式,这个先跳过,回到正题Adapter。

Adapter只要分为三大类:类适配器模式、对象适配器模式和接口适配器模式

为了能以一种愉快的方式把Adapter吃透,我们直接通过具体例子来说吧!

一个人力资源的项目分三大模块:人员信息管理、薪酬管理和职位管理,其中人员信息管理中涉及到了适配器模式。

是这么一回事,一开始开发时,人员信息管理的对象是所有员工的所有信息,我们涉及的员工类是这样滴:

 

后来,公司人手不足,和XX公司借用了一批人员,然后boss 就要求增加一个功能借用人员的管理。

OK,很容易呀,直接把借用人员信息从他们公司传输到我们系统中就好了……事情要是这么简单多没趣呀!

我们需要把这些借用人员信息传输到我们的系统中,系统之间的传输使用RMI(Remote Method Invacation,远程对象调用),

问题是他们公司和我们公司对人员对象的定义不同。他们是这样滴:

 

由上面的类图可以知道,我们的家庭住址是在他们的HomeInfo中,UserName是在BaseInfo中,问题来了,两个系统对人员对象的定义不统一怎么实现两个系统的交互呢?

解决方案:当然是我们的杀手锏Adapter啦!

 

但是又有问题啦,两个对象不在一个系统中,怎么一起用?

So easy!RMI已经帮我们做好了,只要有接口,就可以远程的对象当成本地的对象使用(了解更多可以直接去看RMI文档)。

通过适配器,把outerUser伪装成我们系统中一个IUserInfo对象,这样我们原来的系统基本不用怎么改,所有人员查询、调用和本地一样。

不多说了,下面上代码:

接口IUserInfo.java

package com.freedom.adapter;

public interface IUserInfo {

	// 用户名
	public String getUserName();

	// 家庭地址
	public String getHomeAddress();

	// 手机号
	public String getMobileNumber();

	// 办公电话
	public String getOfficeTelNumber();

	// 职位
	public String getJobPosition();

	// 家庭电话
	public String getHomeTelNumber();

}
接口的实现类UserInf.java

package com.freedom.adapter;

public class UserInfo implements IUserInfo {
	
	@Override
	public String getUserName() {
		System.out.println("用户名");
		return null;
	}

	@Override
	public String getOfficeTelNumber() {
		System.out.println("办公电话");
		return null;
	}

	@Override
	public String getHomeAddress() {
		System.out.println("家庭地址");
		return null;
	}

	@Override
	public String getMobileNumber() {
		System.out.println("手机号");
		return null;
	}

	@Override
	public String getJobPosition() {
		System.out.println("职位");
		return null;
	}

	@Override
	public String getHomeTelNumber() {
		System.out.println("家庭电话");
		return null;
	}
}

可能有人要问了,为什么要把电话号码、手机号码都设置成String 类型,而不是int 类型,你说呢?题外话,这个绝对应该是String 类型,包括数据库也应该是varchar 类型的,手机号码有带区号的,比如+8613267581356,这个你用数字怎么表示?继续看代码,系统的应用如何调用UserInfo 的信息呢?

APP.java

package com.freedom.adapter;

public class App {
	public static void main(String[] args) {
		// 没有与外系统连接的时候,是这样写的
		IUserInfo user = new UserInfo();
		
		// 从数据库中查到101个
		for (int i = 0; i < 101; i++) {
			user.getMobileNumber();
		}
	}
}

从数据库中生成了101 个UserInfo对象,直接打印出来就成了。那然后增加了外系统的人员信息,怎么处理呢?

IOuterUser.java :

package com.freedom.adapter;

import java.util.Map;

public interface IOuterUser {
	
	// 基本信息,比如名称,性别,手机号码了等
	public Map getUserBaseInfo();

	// 工作区域信息
	public Map getUserOfficeInfo();

	// 用户的家庭信息
	public Map getUserHomeInfo();

}

怎么把外系统的用户信息包装成我们公司的人员信息?

OuterUserInfo.java(适配器):

package com.freedom.adapter;

import java.util.Map;

public class OuterUserInfo extends OuterUser implements IUserInfo {
	private Map baseInfo = super.getUserBaseInfo(); // 员工的基本信息
	private Map homeInfo = super.getUserHomeInfo(); // 员工的家庭信息
	private Map officeInfo = super.getUserOfficeInfo(); // 工作信息

	public String getHomeAddress() {
		String homeAddress = (String) this.homeInfo.get("homeAddress");
		System.out.println(homeAddress);
		return homeAddress;
	}

	public String getHomeTelNumber() {
		String homeTelNumber = (String) this.homeInfo.get("homeTelNumber");
		System.out.println(homeTelNumber);
		return homeTelNumber;
	}

	public String getJobPosition() {
		String jobPosition = (String) this.officeInfo.get("jobPosition");
		System.out.println(jobPosition);
		return jobPosition;
	}

	public String getMobileNumber() {
		String mobileNumber = (String) this.baseInfo.get("mobileNumber");
		System.out.println(mobileNumber);
		return mobileNumber;
	}

	public String getOfficeTelNumber() {
		String officeTelNumber = (String) this.officeInfo
				.get("officeTelNumber");
		System.out.println(officeTelNumber);
		return officeTelNumber;
	}

	public String getUserName() {
		String userName = (String) this.baseInfo.get("userName");
		System.out.println(userName);
		return userName;
	}
}

大家看到没?这里有很多的强制类型转换,就是(String)这个东西,如果使用泛型的话,完全就可以避免这个转化,泛型以后再详细讲。这个适配器的作用就是做接口的转换。

最后我们再来看看我们的业务是怎么调用的:

package com.freedom.adapter;

public class App {
	public static void main(String[] args) {
		// 没有与外系统连接的时候,是这样写的
		//IUserInfo user = new UserInfo();
		//与外系统连接的时候,只修改了这一句
		IUserInfo user = new OuterUserInfo(); 
		// 从数据库中查到101个
		for (int i = 0; i < 101; i++) {
			user.getMobileNumber();
		}
	}
}
使用了适配器模式只修改了一句话,其他的业务逻辑都不用修改就解决了系统对接的问题,而且在我们实际系统中只是增加了一个业务类的继承,就实现了可以查本公司的员工信息,也可以外借公司的员工信息,尽量少的修改,通过扩展的方式解决了问题。

适配器模式分为类适配器和对象适配器,这个区别不大,上边的例子就是类适配器,那对象适配器是什么样子呢?

对象适配器的类图是这个样子滴:

 

 

看到没?和上边的类图就一个箭头的图形的差异,一个是继承,一个是关联,就这么多区别,只要把我们上面的程序稍微修改一下就成了对象适配器。


适配器模式不适合在系统设计阶段采用,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,就像我们上面的那个例子一样,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。

讲了这么多,总结一下三种适配器模式的应用场景:

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

最后小结一下适配器模式的优缺点:

1.优点:

1)将目标类和适配者类解耦

2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

3)灵活性和扩展性都非常好,符合开闭原则

2.类适配器还有的优点:

由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

3.类适配器的缺点:

对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

4.对象适配器还有的优点:

把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。

5.对象适配器的缺点:

与类适配器模式相比,要想置换适配者类的方法就不容易。

 http://download.youkuaiyun.com/detail/github_22022001/8290561

下载源码

PCB布局规范及其注意事项(纯干货) 这样做的好处是信号1,3层不会有串扰,4和5作为电源有紧密的耦合,3个信号层都有GND平面可以参考,且不会互相产生串扰,唯一的缺点是布线的层面只有3个信号层(信号03的是最适合来传输高速信号,因为该层的二面都有屏蔽,防止干扰传出,也防止干扰传入)33、影响阻抗匹配的参数(ER介电常数(1GHZ以下默认为4.2,以上的话问板厂),H介质厚度(就是内层压合的PP片厚度),W走线的线宽,T走线的厚度(铜厚/减小线的厚度可以增大阻抗))我这里使用的是CITS25来计算阻抗。 阅读详情

相关推荐

【NLP】使用 PyTorch 从头构建自己的大型语言模型 (LLM)

如果我们在 n 维空间中绘制一个向量,看起来相似的物体(如狗和猫)将彼此靠近,而看起来不相似的物体(如学校和家庭)的嵌入向量将位于更远的地方。为此,我们将使用一种流行的标记器,称为 BPE 标记器,这是一种子词标记器,正在 GPT3 等模型中使用。:前馈网络使用深度神经网络来学习两个线性层(第一层有 d_model 节点,第二层有 d_ff 节点,根据注意力论文分配值)中嵌入向量的所有特征,并且将 ReLU 激活函数应用于第一线性层的输出,为嵌入值提供非线性,并应用 dropout 以进一步避免过度拟合。

sikh_0529的博客 1950

Java设计模式-适配器模式(Adapter)

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。

qq_37400096的博客 2931

Flutter项目在M1/M2 Mac上跑iOS模拟器报错?手把手教你搞定‘arm64架构不兼容’问题

本文详细解析了Flutter项目在M1/M2 Mac上运行iOS模拟器时遇到的‘arm64架构不兼容’问题,提供了多种解决方案,包括排除模拟器的arm64架构、强制使用x86_64架构以及修改插件Podspec文件。帮助开发者快速解决架构兼容性问题,提升开发效率。

weixin_33713707的博客 336

【设计模式——学习笔记】23种设计模式——适配器模式Adapter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解适配器模式的思想,介绍其常见的应用场景,举例说明适配器模式的实现方式

我只管埋头前行,剩下的交给时间。 5599

ROS机器人全覆盖路径规划实战:6种ipa算法对比与选型指南(附避坑经验)

本文深入对比了ROS中ipa_coverage_planning功能包集成的6种全覆盖路径规划算法,包括牛耕分解、栅格旅行商、神经网络、局部能量最小、轮廓线和凸感知放置。文章从覆盖率、重复率、计算效率、动态避障等核心工程指标出发,提供了基于不同场景(如静态/动态环境、规则/复杂布局)的实战选型指南,并分享了神经网络和局部能量最小等关键算法的参数调优与避坑经验,旨在帮助开发者根据实际需求选择并优化最合适的ipa覆盖算法。

perl8的博客 363

Java设计模式(七)结构型- 适配器模式Adapter Class/Object(史上最全适配器模式类/ 对象/接口适配)与使用场景以及优缺点

适配器模式

移动端开发与最新技术 1424

YOLO26小目标检测实战:STAL标签分配+MuSGD优化,VisDrone数据集漏检率降50%

小目标检测是计算机视觉的经典难题,而VisDrone数据集小目标占比极高:数据集中小目标(像素面积<32×32)占比超过60%,且大量目标仅为几个像素,特征信息极度匮乏;背景复杂且干扰多:无人机航拍场景包含建筑物、树木、人群、车辆等复杂背景,小目标易被背景淹没;尺度变化与遮挡严重:同一目标在不同帧中尺度差异大,且小目标极易被其他目标遮挡;传统模型的固有缺陷标签分配策略(如ATSS、SimOTA)偏向大目标,小目标的正样本分配不足,导致模型对小目标不敏感;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1186

Java设计模式——适配器模式

适配器(Adapter)模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式通过适配器类将一个类的接口转换成另一个接口,使得原本不兼容的类可以一起工作。适配器模式分为类适配器和对象适配器两种实现方式。适配器模式提高了类的透明性和复用性,增加了系统的灵活性和可扩展性,但在某些情况下会增加系统的复杂性和维护成本。适配器模式适用于需要将不同类的接口统一起来的场景,广泛应用于系统集成、框架扩展和第三方库集成等场景中。

weixin_43841461的博客 1224

c++ webrtc基础(1) :webrtc源码下载与编译、项目模块介绍、学习资料推荐

本篇博客介绍webrtc源码的下载与编译,以及推荐webrtc学习资料。 源码下载 电脑环境:win10/win11 64bit,合理的上网环境,没有合理的网络环境无法拉取、下载webrtc代码和工具,宽带速度要快,尽量50M. 主要步骤如下: (1) 安装git (2) 打开cmd控制台,下载google开发工具depot_tools: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git (3) 新建一个目

琅嬛福地 3296

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

Java设计模式之结构型-适配器模式 (Adapter)

????文章示例代码???? 附链 你也可以在这些平台阅读本文: 语雀 个人博客 定义 将一个类的接口转换成客户端期望的另一个接口。 适配器模式可以使原本接口不兼容的类可以一起工作。 两种模式 适配器模式有两种模式: 对象适配器:采用组合方式进行类的委托 类适配器:采用继承方式 三种角色 目标角色(Target):客户端所期待的接口(也可以是具体类或者抽象类)。 源角色(Adaptee):被适配...

Horace's Blog 607

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java23种设计模式 适配器模式【Adapter Pattern】

好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛。今天讲适配器模式,这 个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用, 虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换 为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也 是这个意...

宇智波带土 340

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

java23种设计模式--适配器模式(Adapter Pattern)

著名的设计模式“四人帮”这样评价适配器模式: 将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four 这篇来介绍一下适配器模式(Adapter Pattern),在实际生活中也有很多类似于适配器的例子,例如国外有些电压是110V而国内电压是220V,那么从国外带回国内使用的电器需要有一个变压器才能正常...

weixin_37967166的博客 248

java 23 种设计模式-06-适配器模式(Adapter Pattern)

目录 目录 适配器模式 实际案例 定义 测试 实现方式 UML &amp; Code UML Code 系列导航 适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和...

3万+

Java GoF 23种设计模式-结构型模式-适配器模式(Adapter Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、代码实现五、适配器模式与装饰者模式比较 一、模式定义 适配器模式(Adapter Pattern) 是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 适配器模式将一个接口转换成客用户所期待的样子,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式有对象适配器和类适配器两种实现; 由于java不支持多继承,本文仅对对象适配器实现进行说明 二、模式动机 通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,

WU4566285的博客 381

Java23种设计模式之适配器模式(Adapter Pattern)

模式名称:适配器模式;定义:将一个类的接口变换成客户端所期待的另外一种接口,从而使原本因接口不匹配而无法工作的两个类能够一起工作;使用场景:有动机去修改一个已经投产中的接口,适配器模式可能是最适合的一种模式,符合系统扩展时候因需求而不符合系统的接口;一般详细设计阶段没必要过多考虑适配器模式,主要是应用到后期的扩展当中;与对象适配器的区别: 类适配器是类之间的继承,对象适配器是对象的合成关系,也可以...

K宝的博客 253

java中23种设计模式之6-适配器模式(adapter pattern)

1. 概述   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 2. 解决的问题   即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 3. 模式中的角色   3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。   3.2 需要适...

weixin_34061482的博客 99

Java23种设计模式之适配器模式(Adapter)

概念: 适配器模式将一个类的接口,转换为客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。 术语: source:待适配的类/对象/接口 Adapter:适配器 destination:适配后可用的类/对象/接口 分类: 类适配器模式 Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配 对象适配器模式 将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实

Jieur的博客 978

java23种设计模式之适配器模式(Adapter)

适配器模式

chx0501的专栏 414

java23种设计模式--适配器模式(Adapter)

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 6、适配器模式(Adapter)       适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器

xiangxue336的专栏 634

【Java中23种面试常考的设计模式之适配器模式(Adapter)---结构型模式】

接下来我们要进行学习的是:【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】。Adapter类:通过在内部包装一个Adaptee对象,把源接口转换成目标接口。Target类:用户期待的接口,目标可以是具体的或抽象的类,也可以是接口。Client—Main:客户端测试类。Adaptee类:需要适配的类。

Coder_ljw的博客 719

手把手教你搞懂java 23种设计模式 适配器模式 Adapter

适配器模式 Adapter 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成 的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 下面就分种进行讲: 首先,我们来看看 01、类的适配器模式,先看类图的: ...

Ooo0oops 310

Java开发中的23种设计模式之六:适配器模式(Adapter)

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式,先看类图: 核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码:

专注=效率 854

Java开发中的23种设计模式详解----适配器模式(Adapter)

我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图: 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器

sjyttkl的专栏 383

23种设计模式之适配器模式(Adapter Pattern)

、本篇文章将23种设计模式中的适配器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+
上一篇: java23种常用设计模式之单例模式(Singleton)
下一篇: java23种常用设计模式之装饰模式(Decorator)
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值