作者:rabbitwfly

假如我们又这样软件系统,我们希望它能够和一个新的库搭配使用,但是这个库所提供的接口与我们的软件系统不兼容,我们不想改变现有代码就能解决这个问题,怎么办?这个时候我们就需要将这个新的库接口转换成我们所需要的接口,这就是适配器模式设计动机。

一、模式定义

何谓适配器模式?适配器模式就是将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

在适配器模式中,我们可以定义一个包装类,包装不兼容接口的对象,这个包装类就是适配器,它所包装的对象就是适配者。

适配器提供给客户需要的接口,适配器的实现就是将客户的请求转换成对适配者的相应的接口的引用。也就是说,当客户调用适配器的方法时,适配器方法内部将调用适配者的方法,客户并不是直接访问适配者的,而是通过调用适配器方法访问适配者。因为适配器可以使互不兼容的类能够“合作愉快”。

二、模式结构

这个适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装别适配者。而且这样做还有一个优点,被适配者的任何子类,都可以搭配适配器使用。

适配器模式有如下四个角色:

Target:目标抽象类

Adapter:适配器类

Adaptee:适配者类

Client:客户类

三、模式实现

在这里我们模拟一个机器人。首先我们拥有一个机器人,它可以叫(cry),跑(run)。现在我们希望它能够像小狗一样叫,像小狗一样跑。

首先我们需要一个机器人接口:Robot.java。提供cry()和run()方法。

轮到重点啦:适配器,这个适配器能够使仿生机器人像狗一样叫,一样跑。

运行结果。

如果我们希望这个仿生机器人能够像鸟一样唧唧的叫和飞呢?只需要添加一个能够叫和飞的鸟类以及一个鸟的适配器即可。如下:

客户端:Client.java

运行结果。

如果我们希望这个仿生机器人能够像鸟一样唧唧的叫和飞呢?只需要添加一个能够叫和飞的鸟类以及一个鸟的适配器即可。如下:

四、模式优缺点

优点

  1. 将目标类和适配者类解耦,通过使用适配器让不兼容的接口变成了兼容,让客户从实现的接口解耦。
  2. 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
  3. 灵活性和扩展性都非常好在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。

五、使用场景

  1. 系统需要使用现有的类,而这些类的接口不符合系统的需要。

2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类

六、模式扩充

适配器模式分为对象适配器和类适配器。前面所概述的是对象适配器。为什么没有将类适配器呢?因为类适配器需要使用多重继承,这个在java中没有办法实现的。但是当我们遇到可以使用多重继承语言的时候,还是可能会遇到这种需求。

类适配器模式UML图。

在类适配器中,由于适配器是适配者的子类,所以可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。但是对于一些不支持多重继承的编程语言来说(Java ,C#),其使用就会存在一定的局限性:不能将一个适配者类和它的子类都适配到目标接口。

对于对象适配器而言,一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。但是如果我们需要置换掉适配者的某些方法时,这个实现就会比较难,我们首先要先做一个适配者的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

七、总结

1、当我们需要使用的一个现有的类,但是他的接口并不符合我们的需求时,我们可以使用适配器模式。

2、适配器模式分为类适配器和对象适配器,其中类适配器需要用到多重继承。

java适配器模式_适配器模式的设计,你get到了吗?相关推荐

  1. 力扣Java编译器_力扣--设计单链表

    在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点.插入 ...

  2. Java模式(适配器模式)

    今天看了下Java中的适配器模式,以下就来小做下总结和谈谈感想,以便日后使用. 首先,先来先讲讲适配器.适配就是由"源"到"目标"的适配,而当中链接两者的关系就 ...

  3. java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc

    JAVA课程设计_闹钟的设计与实现项目-报告_附源代码 第2章 MACROBUTTON AcceptAllChangesInDoc [双击此处键入1级标题] PAGE 2 - PAGE 1 - .. ...

  4. (设计模式六)java设计模式之适配器模式

    适配器模式将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 一.解决问题: 即Adapter模式使得原本由于 ...

  5. Java设计模式之适配器模式(属于结构型模式)

    Java设计模式之适配器模式(结构型模式) 定义:将一个类的接口转换成客户希望的另外一个接口.Adaptor模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 模式中的角色: 目标接口(T ...

  6. java人力资源管理系统设计_人力资源管理系统——《Java Web程序设计》课程设计...

    内容简介: 人力资源管理系统--<Java Web程序设计>课程设计,正文共24页,7418字,附源程序. 0 引言 全球范围内的企业内部组织正在发生巨变,未来企业成功的关键的依靠企业人力 ...

  7. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  8. java设计连连看心得_基于Java的连连看游戏的设计与实现

    ComputerKnowledgeand Technology 电脑知识与技术 软件设计开发本栏目责任编辑:谢媛媛 第7卷第35期 (2011年12月) 9 基于Java的连连看游戏的设计与实现 陈珊 ...

  9. java契约_基于契约式设计的Java编译器实现

    上海交通大学硕士学位论文 基于契约式设计的Java编译器实现 学校:上海交通大学 院系:软件学院 专业:计算机软件与理论 班级:B0403791 学号:1040379006 作者姓名:张嘉铭 指导教师 ...

最新文章

  1. php sql 条件拼组_ThinkPHP框架SQL操作链式写法原理(浅显易懂)
  2. 【高级Java架构师系统学习】java十六进制字符串转数字
  3. access 使用dsn 连接字符串_致正在备考Access的你,学习重点和题库以及b站优课请查收!...
  4. 获取PE文件的区段表
  5. FastReport人民币大写转换
  6. OpenCV之线性混合操作
  7. A wet night
  8. 亲身体验过13款滚动截屏App,谁才是最好用的iPhone长截屏工具?
  9. GSM/CDMA/GPRS介绍
  10. Date对象的getMonth()对象的错误使用导致页面1月份时报错
  11. vs2017工具箱问题(不见工具箱选项卡此组中没有可用控件控件灰化)
  12. 探访北大最AI的食堂!刷脸打饭,机器认识200多道菜
  13. 解决steam饥荒联机版(DST Dont Starve Together)启动时error during initialization的方法
  14. ئاندرويىد تېلېفۇندىكى ئۇيغۇرچە
  15. html弹窗广告文件怎么做,视频加入广告 如何在视频文件中加入弹窗广告
  16. 【渝粤题库】广东开放大学 高级商务办公软件应用 形成性考核
  17. Chrome浏览器命令行启动参数
  18. 大学毕业论文指导-内容陈述
  19. latex范数和|| d ||
  20. cmd的tree命令使用方法

热门文章

  1. 用C++实现可重用的数学例程
  2. Internet Explorer 6 中的 CSS 增强功能
  3. Facebook 正在大规模重构 React Native
  4. 单曲《我是一个程序员》
  5. 第七节:实战前必须掌握的10个指令(上)
  6. php更多式样,php_1
  7. caffe与tensorflow框架下卷积的维度计算与一致性证明
  8. Windows10/11安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机
  9. 高通量数据中批次效应的鉴定和处理(三)- 如何设计尽量避免批次影响
  10. 大学生影视主题网页制作 银翼杀手2049电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作