设计模式 适配器模式

1.背景
适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢

2.B接口转换为 A 接口,怎么办?继承,能解决,但是比较傻

在这里插入图片描述
通过适配器,把 OuterUser 伪装成我们系统中一个 IUserInfo 对象

本系统的接口:

public interface IUserInfo { //获得用户姓名public String getUserName(); //获得家庭地址public String getHomeAddress(); //手机号码,这个太重要,手机泛滥呀public String getMobileNumber(); //办公电话,一般式座机public String getOfficeTelNumber(); //这个人的职位是啥public String getJobPosition(); //获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作public String getHomeTelNumber(); } 

这个接口的实现类:

public class UserInfo implements IUserInfo { /* * 获得家庭地址,下属送礼也可以找到地方*/public String getHomeAddress() { System.out.println("这里是员工的家庭地址...."); return null; } /* * 获得家庭电话号码*/public String getHomeTelNumber() { System.out.println("员工的家庭电话是...."); return null; } /* * 员工的职位,是部门经理还是小兵*/public String getJobPosition() { System.out.println("这个人的职位是BOSS...."); return null; } /* * 手机号码*/public String getMobileNumber() { System.out.println("这个人的手机号码是0000...."); return null; } /* * 办公室电话,烦躁的时候最好“不小心”把电话线踢掉,我经常这么干,对己对人都有好处*/public String getOfficeTelNumber() { System.out.println("办公室电话是...."); return null; } /* * 姓名了,这个老重要了*/public String getUserName() { System.out.println("姓名叫做..."); return null;} 
} 

本系统程序运行

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

外部系统的接口:

@SuppressWarnings("all") 
public interface IOuterUser { //基本信息,比如名称,性别,手机号码了等public Map getUserBaseInfo(); //工作区域信息public Map getUserOfficeInfo(); //用户的家庭信息public Map getUserHomeInfo(); }

外部系统的接口的实现类:

@SuppressWarnings("all") 
public class OuterUser implements IOuterUser { /* * 用户的基本信息*/public Map getUserBaseInfo() { HashMap baseInfoMap = new HashMap(); baseInfoMap.put("userName", "这个员工叫混世魔王...."); baseInfoMap.put("mobileNumber", "这个员工电话是....");return baseInfoMap; } /* * 员工的家庭信息*/public Map getUserHomeInfo() { HashMap homeInfo = new HashMap(); homeInfo.put("homeTelNumbner", "员工的家庭电话是...."); homeInfo.put("homeAddress", "员工的家庭地址是...."); return homeInfo; } /* * 员工的工作信息,比如职位了等*/public Map getUserOfficeInfo() { HashMap officeInfo = new HashMap(); officeInfo.put("jobPosition","这个人的职位是BOSS..."); officeInfo.put("officeTelNumber", "员工的办公电话是...."); return officeInfo; } 
}

外系统的用户信息包装成我们公司的人员信息呢?看下面的 OuterUserInfo 类源码,也就是
我们的适配器:接口实现的是本系统的接口

@SuppressWarnings("all") 
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; } 
}

运行:

public class App { 
public static void main(String[] args) { //没有与外系统连接的时候,是这样写的//IUserInfo youngGirl = new UserInfo();//老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点IUserInfo youngGirl = new OuterUserInfo(); //我们只修改了这一句好   OuterUserInfo  是适配器//从数据库中查到101个for(int i=0;i<101;i++){ youngGirl.getMobileNumber(); } } 
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.3.22 ARM

实现三个按键的中断 main.c &#xff1a;主函数初始化 #include "key_inc.h" #include "uart4.h" //封装延时函数 void delay(int ms) {int i, j;for (i 0; i < ms; i){for (j 0; j < 2000; j);} } int main() {char *s "hello world"…

ES的集群节点发现故障排除指南(2)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容&#xff0c;第二部分。 原文参考及相关内容&#xff1a; 英文原文&#xff08;官网&#xff09; 第一部分-&#xff08;1&#xff09; 已选出主节点但状态不稳定&#xff1f; 当一个节点赢得主节点选举时&…

XR“黑话”

MTP&#xff08;Motion-To-Photon Latency&#xff09;&#xff1a;实际人体发生运动到图像显示到屏幕上的时间延迟。早期一些vr产生晕动症的主要原因。 ATW&#xff08;Asynchronous Timewarp&#xff09;&#xff1a;主要解决两个问题&#xff0c;一是延迟&#xff0c;二是补…

【记录 | 最小生成树】繁忙的都市(Kruskal算法)

[SCOI2005] 繁忙的都市 题目描述 城市 C 是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的:城市中有 n n n 个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向…

双雷达(velodyne)的启动与集成

1 引入 自动导航需要多个雷达来避免盲区和提高定位精度。本文项目使用前后两个velodyne VLD16的雷达。 2 启动两个雷达的驱动 2.1 方案选择 查了网上,看到似乎有两种方案: 一种是采用的.launch文件中不同的namespace,去配置不同的参数,参阅:https://zhuanlan.zhihu.co…

AI大模型学习在当前技术环境下的重要性与发展前景

目录 前言1 学科基础与技能要求1.1 数学基础的深厚性1.2 编程能力的必要性1.3 对特定领域业务场景的了解 2 模型结构与算法的优化2.1 模型结构的不断演进2.2 算法优化的重要性2.3 准确性与效率的提升 3 AI大模型学习的应用场景3.1 自然语言处理3.2 计算机视觉3.3 推荐系统 结语…

YOLO算法改进Backbone系列之:Dfformer

摘要&#xff1a;配备多头自注意&#xff08;MHSA&#xff09;的模型在计算机性能方面取得了显著的性能。它们的计算复杂性与输入特征图中的像素平方成正比&#xff0c;导致处理缓慢&#xff0c;特别是在处理高分辨率图像时。新型的token Mixer 被提出作为MHSA的替代品&#xf…

抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材

120个叠加效果视频转场过渡素材&#xff0c;抖音,剪映,TikTok,短视频转场pr模板项目工程文件。 效果&#xff1a;VHS、光效、胶片、霓虹灯闪光、X射线、信号、老电影等。 适用软件&#xff1a;Adobe Premiere Pro 2018 12.0或更高版本。 视频素材与大多数应用程序兼容&#xff…

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…

基于Spring Boot技术的幼儿园管理系统

摘 要 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种活动信息、课程信息、菜谱信息、通知公…

【Linux】线程的概念{虚拟地址堆区细分/缺页中断/页/初识线程/创建线程/优缺点}

文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写…

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…

Python中装饰器函数的用法介绍

在Python中&#xff0c;装饰器&#xff08;Decorator&#xff09;是一种特殊的函数&#xff0c;它可以用来修改或增强其他函数或方法的行为。装饰器允许您在不修改原始函数代码的情况下&#xff0c;向函数添加新的功能或行为。它们通常用于添加日志记录、性能分析、验证或修改函…

计算机专业保研辅导

接计算机专业保研辅导

C语言:自定义类型(结构体)

目录 一、结构的特殊声明二、结构的自引用三、结构体内存对齐1.对齐规则2.为什么存在内存对齐(1)平台原因 (移植原因)&#xff1a;(2)性能原因&#xff1a; 3.修改默认对齐数 四、结构体传参五、结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段使用的注意…

Java字符串常量池

引言&#xff1a; 在Java编程中&#xff0c;字符串常量池一直是一个备受关注的话题。本文将从创建对象的思考、字符串常量池、再谈String对象创建等方面深入探讨Java字符串常量池。 一、创建对象的思考 在Java中&#xff0c;我们可以使用new关键字来创建对象&#xff0c;比如&a…

简单函数_素数对

任务描述 两个相差为2的素数称为素数对&#xff0c;如5和7&#xff0c;17和19等&#xff0c;本题目要求找出所有两个数均不大于n的素数对。输入格式: 一个正整数n。1 < n < 10000。输出格式: 所有小于等于n的素数对。每对素数对输出一行&#xff0c;中间用单个空格隔开…

设计模式 模板方法模式

01.如果接到一个任务&#xff0c;要求设计不同型号的悍马车 02.设计一个悍马车的抽象类&#xff08;模具&#xff0c;车模&#xff09; public abstract class HummerModel {/** 首先&#xff0c;这个模型要能够被发动起来&#xff0c;别管是手摇发动&#xff0c;还是电力发动…

39 openlayers 对接地图图层 绘制点线面圆

前言 这里主要是展示一下 openlayers 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 增加 省市区县 的边界标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;" &g…

Rancher(v2.6.3)——Rancher部署Mysql(单机版)

[详细说明请查看Rancher部署Mysql说明文档]&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#2rancher%E9%83%A8%E7%BD%B2mysql ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的…