Java设计模式-4、适配器模式

适配器模式

       在我们的应⽤程序中我们可能需要将两个不同接⼝的类来进⾏通信,在不 修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。 这个中间件就是适配器。所谓适配器模式就是将⼀个类的接⼝,转换成客 户期望的另⼀个接⼝。它可以让原本两个不兼容的接⼝能够⽆缝完成对 接。 作为中间件的适配器将⽬标类和适配者解耦,增加了类的透明性和可复⽤ 性。

作为中间件的适配器将⽬标类和适配者解耦,增加了类的透明性和可复⽤ 。
类适配器:
对象适配器:

Target: 定义 Client 真正需要使⽤的接⼝。
Adaptee: 其中定义了⼀个已经存在的接⼝,也是我们需要进⾏适配的 接⼝。
Adapter: Adaptee Target 的接⼝进⾏适配,保证对 target 中接⼝ 的调⽤可以间接转换为对 Adaptee 中接⼝进⾏调⽤。中间商
适配器模式的优缺点
优点:
1. 提⾼了类的复⽤;
2. 组合若⼲关联对象形成对外提供统⼀服务的接⼝;
3. 扩展性、灵活性好。
缺点:
1. 过多使⽤适配模式容易造成代码功能和逻辑意义的混淆。
2. 部分语⾔对继承的限制,可能⾄多只能适配⼀个适配者类,⽽且⽬标类
必须是抽象类。
代码:
1. 原方法
public class SmsSimple {
	
	public void send() {
        System.out.println("老短信接口实现方法");
    }
}

2 新抽象接口

public interface SmsService {
	void sendSms();
}

3 对象适配器

/**
 * 组合方式的适配器使用 对象适配器
 * @author WHM
 *
 */
public class SmsAdapter implements SmsService {

	private SmsSimple simple;
	
	public SmsAdapter(SmsSimple simple) {
		this.simple = simple;
	}
	
	public void sendSms() {
		System.out.println("转换成老接口过程");
		System.out.println("----");
		simple.send();
	}
}

4. 类适配器

/**
 * 继承方式的适配器使用 类适配器
 * @author WHM
 *
 */
public class SmsAdapter2 extends SmsSimple implements SmsService{

	@Override
	public void sendSms() {
		System.out.println("转成成老接口过程");
		super.send();
	}
}

5 验证:

public class TMain {
	public static void main(String[] args) {
		//组合方式的适配器使用 对象适配器

//		  SmsSimple simple = new SmsSimple();
//		  SmsAdapter newSms = new SmsAdapter(simple);
//		  newSms.sendSms();


		 // 继承方式的适配器使用 类适配器
		   SmsAdapter2 sms2 = new SmsAdapter2();
		   sms2.sendSms();

	}
}

结果:

 Spring中DispatherServlet采用了适配器模式

总结:

        适配器模式主要用于双方都无法改变的时候才会去使用的。当然在设计之初也有要考虑到的时候,比如需要跟第三方打交道。这时候我们不可能为了去迎合他的需求去改变自己的接口。所以这时候就需要使用适配器模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【协议】03、深度解剖之HTTP协议

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的标准、约定或者规则的集合,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。使用的默认端口为80端口。浏览器的默认端口也是80端…

【操作系统】第二章:进程管理

第二章:进程管理 OVERVIEW第二章:进程管理一、进程与线程1.进程概述(1)进程PCB:(2)进程的组成:(3)进程的特征:2.进程的状态与转换(1&a…

基于储能进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

算法练习随记(三)

1.全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#x…

如何用AI玩转IG广告,打造高互动的引流营销?

如何用AI玩转IG广告,打造高互动的引流营销?相信做引流的卖家,都有接触过IG广告,然而流量引过来了,怎么处理客户的私信? 私信对话是你与粉丝培养深度关系的管道,好的互动不仅能养成高黏着度的铁粉…

5 个Python高级特性让你在不知不觉中成为Python高手

你已经使用 Python 编程了一段时间,编写脚本并解决各种问题。是你的水平出色吗?你可能只是在不知不觉中利用了Python的高级特性。 从闭包(closure)到上下文管理器(context managers),本文给出一…

Linked List

链表在力扣上的介绍:链表(Linked List)是最简单的线性的、动态数据结构。理解它是理解树结构、图结构的基础。区别于数组,链表中的元素不是存储在内存中连续的一片区域,链表中的数据存储在每一个称之为「结点」复合区域…

五、传输层

(一)TCP传输控制协议 可靠的、面向连接的字节流服务,全双工,有端口寻址功能 1、TCP的三种机制 1.使用序号对分段的数据进行标记,便于调整数据包 2.TCP使用确认、校验和和定时器系统提供可靠性 3.TCP使用可变大小的…

ACK Net Exporter 与 sysAK 出击:一次深水区的网络疑难问题排查经历

作者:谢石、碎牙 不久前的一个周五的晚上,某客户A用户体验提升群正处在一片平静中,突然,一条简短的消息出现,打破了这种祥和: “我们在ACK上创建的集群,网络经常有几百毫秒的延迟。" 偶发…

C++模板基础(四)

函数模板&#xff08;四&#xff09; ● 函数模板的实例化控制 – 显式实例化定义&#xff1a; template void fun(int) / template void fun(int) //header.h template<typename T> void fun(T x) {std::cout << x << std::endl; }//main.cpp #include&quo…

Python(白银时代)——文件操作

文件的基本操作 概念 在计算机中&#xff0c;文件是以 二进制 的方式保存在磁盘上的 文本文件 和 二进制文件 文本文件&#xff08;用记事本打开能直接能看懂的&#xff09; 可以使用 文本编辑软件查看 本质上还是二进制的,比如 Python的源码文件 二进制文件&#xff08;用…

并发编程(六)-AbstractExecutorService源码分析

一、AbstractExecutorService简介AbstractExecutorService是一个抽象类&#xff0c;实现了ExecutorService接口&#xff0c;提供了线程池的基本实现。它是Java Executor框架的核心类&#xff0c;提供了线程池的基本操作&#xff0c;如提交任务、管理线程池、执行任务等。自定义…

阻塞队列(BlockingQueue)的实现和使用

阻塞队列&#xff08;BlockingQueue&#xff09; 文章目录阻塞队列&#xff08;BlockingQueue&#xff09;阻塞队列的梗概解耦合和削峰填谷java代码实现一个阻塞队列阻塞队列的梗概 众所周知&#xff0c;队列是一种数据结构&#xff0c;符合先进先出的结构&#xff0c;先进先出…

【动态绘图】python可视化--丝滑版

✅作者简介&#xff1a;在读博士&#xff0c;伪程序媛&#xff0c;人工智能领域学习者&#xff0c;深耕机器学习&#xff0c;交叉学科实践者&#xff0c;周更前沿文章解读&#xff0c;提供科研小工具&#xff0c;分享科研经验&#xff0c;欢迎交流&#xff01;&#x1f4cc;个人…

鼎桥通信,拥抱基础创新的“高灵活性”时代

作者 | 曾响铃 文 | 响铃说 伴随数智化转型成为时代变革大方向&#xff0c;一批走在时代前端的数智化转型企业应运而生&#xff0c;不断丰富5G、物联网等新兴技术的应用场景&#xff0c;构建万智互联的产业生态。作为国内通信领域的引领者&#xff0c;鼎桥通信技术有限公司&a…

AF染料试剂Alexa fluor 680 PEG Biotin,AF680 PEG Biotin,荧光强度稳定利于多种荧光标记

文章关键词&#xff1a;AF染料试剂&#xff0c;AF680&#xff0c;PE-Biotin衍生物Alexa fluor 680 PEG Biotin&#xff0c;AF680 PEG Biotin | Alexa fluor 680-PEG-生物素| CAS&#xff1a;N/A | 纯度&#xff1a;95%试剂参数信息&#xff1a; CAS&#xff1a;N/A 外观&am…

docker使用

dokcer 安装 # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager …

精确性和准确性是两码事儿

准确性(Accuracy)是与正确答案的接近程度&#xff0c;精确性(Precision)是对这个答案的分辨率。 假设&#xff0c;你问我&#xff0c;”现在几点了?” 我抬头看看太阳&#xff0c;然后估算了一下&#xff0c;回答道 “现在是上午 10 点 35 分 22.131 秒” 我给出的是一个足…

Nacos配置中心优雅配置JSON数据格式

在我业务开发中&#xff0c;需要在配置中心配置Json数据&#xff0c;返回给前端。因Nacos默认不支持Json格式配置&#xff0c;需要搭配监听器获取配置中心Json数据&#xff0c;返回给客户端。二、搭配Nacos配置Josn数据1. bootstrap.ymlserver:port: 9000 spring:application:n…

Vue使用ElementUI对table的指定列进行合算

前言 最近有一个想法&#xff0c;就是记录自己花销的时候&#xff0c;table中有一项内容是花销的金额。然后想在table的底部有一项内容是该金额的总计。 然后我就顺着elementui的table组件寻找相关的demo&#xff0c;还真发现了一个这样的demo。 对于这个demo&#xff0c;官方…