热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件设计模式白话文系列(七)适配器模式

原标题:软件设计模式白话文系列(七)适配器模式1、描述适配器模式顾名思义就是将某个类的接口转换成客户端期望的另一个接口表文章来源地址7084.html示。适配器模式可以消除由于接口不匹配所造成的类兼容

原标题:软件设计模式白话文系列(七)适配器模式

1、描述

适配器模式顾名思义就是将某个类的接口转换成客户端期望的另一个接口表文章来源地址7084.html示。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。

2、适用性

客户端需要调用现有的业务类,但此业务类的接口又不适用客户端的调用,这时就可以使用适配器模式,提供一个适配器类来达到目的。

3、实现逻辑

适配器模式一般包括下面三种角色类:


  • 目标接口类:定义客户端需要的接口规范。

  • 适配者类:现有的业务类。

  • 适配器类:将现有业务类的接口转换为适合客户端调用的接口

适配器模式有两种实现方式:

一种是继承现有业务类(适配者类)并实现目标接口类,在实现目标接口时调用父类方法,我们称之为类www.yii666.com适配器。但这种适配器缺点很明显,继承会使现有的业务类(适配者类)接口对适配器类完全暴露,使得适配器具有现有接⼝类的全部功能,破坏了适配者类的封装性。

通常情况下我们会使用另一种对象适配器,对象适配只需实现目标接口,持有一个适配者类的实例并扩展其方法。这样做的好处是客户端调用适配器类时只能调用自己需要的接口,保证了原有接口的封装性。

4、实战代码

现有用户业务类存在用户 id 查询用户和列表查询返回用户实例对象或其实例集合,但现在新增业务需要通过 id 查询用户信息并返回 JSON 字符串。

4.1 对象适配器

下面代码实现:

/**
* 用户类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 06:00:46
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
private Long id;
private String name;
}
/**
* 适配者类原有接口 在适配器模式中无实际左右 可以忽略
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:21:36
*/
public interface MemberService {
Member findMemberById(Long id);
List listMember();
}
/**
* 适配者类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:24:49
*/
public class MemberServiceImpl implements MemberService {
/**
* 模拟 DB 初始化点数据
*/
public static final Map db = new HashMap<>();
static {
db.put(1L, new Member(1L, "张三"));
db.put(2L, new Member(2L, "李四"));
}
@Override
public Member findMemberById(Long id) {
return db.get(id);
}
@Override
public List listMember() {
return new ArrayList<>(db.values());
}
}
/**
* 目标接口类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:21:36
*/
public interface ClientService {
String findJsonById(Long id);
}
/**
* 适配器类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:27:46
*/
public class MemberServiceAdapter implements ClientService {
private MemberService memberService;
public MemberServiceAdapter(MemberService memberService) {
this.memberService = memberService;
}
@Override
public String findJsonById(Long id) {
Member member = memberService.findMemberById(id);
String jsOnStr= JSONUtil.toJsonStr(member);
return jsonStr;
}
}
/**
* 测试类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022文章来源地址7084.html-11-11 21:29:56
*/
public class Client {
public static void main(String[] args) {
MemberServiceAdapter adapter = new MemberServiceAdapter(new MemberServiceImpl());
System.out.println(adapter.findJsonById(1L));
}
}

执行结果:

4.2 类适配器

这里这提供适配器类和测试类,其余类同对象适配器一致。

/**
* 适配器类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:27:46
*/
public class MemberServiceAdapter extends MemberServiceImpl implements ClientService {
@Override
public String findJsonById(Long id) {
Member member = super.findMemberById(id);
String jsOnStr= JSONUtil.toJsonStr(member);
return jsonStr;
}
}
/**
* 测试类
*
* @author Eajur.Wen
* @version 1.0
* @date 2022-11-11 21:29:56
*/
public class Client {
public static void main(String[] args) {
MemberServiceAdapter adapter = new MemberServiceAdapter();
System.out.println(adapter.findJsonById(1L));
System.out.println(adapter.listMember());
}
}

执行结果:

从结果可以看出,类适配器确实达到了我们需要的效果,实现了通过 id 过去对象 JSON 字文章来源站点https://www.yii666.com/符串的功能。但是同时也把我们不打算提供给客户端的获取全部列表暴露了出来。 违反了合成复用原则

5、 适配器模式和代理模式


5.1 相同点

适配器模式和代理模式结构同属结构型模式。两者都是通过增加一层中介层(代理模式增加代理类,适配器模式增加适配器类)来实现对原有类的扩展。

5.2 不相同点

两者应用场景有明显不同,适配器模式主要针对新旧接口不一致时导致的客户端无法正常调用的情况,因为我们旧接口类可能存在某种耦合而导致无法重构,为了使用旧接口的某些功能,而创建出来的转换器使旧接口转换成能被客户端使用的新接口。

而代理模式的主要作用是为了不把www.yii666.com具体实现暴露出去,且通过代理类做一些处理。代理类接口和原有接口需要保证完全原一致。

来源于:软件设计模式白话文系列(七)适配器模式


推荐阅读
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • Vue CLI 初始化 Webpack 项目时,main.js 文件是如何被调用的? ... [详细]
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
author-avatar
岚氵的幽岚1980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有