适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有类适配器模式和对象适配器模式两种不同的形式。

适配器模式所涉及的角色:1. 目标角色(Target): 这就是所期待得到的接口。2. 源角色(Adaptee):需要适配的接口3. 适配器角色(Adapter):适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
package com.learn.adapter;/*** 目标角色(Target),这就是所期待得到的接口* @author Leon.Sun**/
public interface Target {public void request();}
package com.learn.adapter;/*** 源角色(Adaptee),需要适配的接口* @author Leon.Sun**/
public class Adaptee {public void specificRequest() {System.out.println("被适配的类Adaptee");}}
package com.learn.adapter;/*** 适配器角色(Adapter):适配器类是本模式的核心,适配器把源接口转换成目标接口.* 显然,这一角色不可以是接口,而必须是具体类.* * 类适配器决定了Target不能为类,只能为接口,因为JAVA不支持多继承的关系* @author Leon.Sun**/
public class Adapter extends Adaptee implements Target {@Overridepublic void request() {super.specificRequest();}}
package com.learn.adapter;public class MainTest {public static void main(String[] args) {Target adapter = new Adapter();adapter.request();}
}
对象适配器1. 目标角色(同上,这里的目标角色Target可以为类)2. 源角色(同上)3. 适配器角色
package com.learn.adapter;public class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {this.adaptee.specificRequest();}}
package com.learn.adapter;public class MainTest {public static void main(String[] args) {Target adapter = new ObjectAdapter(new Adaptee());adapter.request();}
}
Jdk中的适配器模式1. java.util.Arrays#asList()2. java.io.InputStreamReader(InputStream)3. java.io.OutputStreamWriter(OutputStream)
优点:1. 系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。2. 更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。缺点:1. 过多的使用适配器,会让系统非常零乱,不易整体进行把握。2. 如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
默认适配器1. 当你想实现一个接口但又不想实现接口中所有的方法,只想去实现一部分方法时,就用到了默认适配器模式。2. 在接口和具体实现类中添加一个抽象类,而用抽象类是实现目标接口的所有方法。3. 而具体的实现类只需要覆盖其需要完成的方法即可。
package com.learn.adapter;/*** 接口类,有许多方法,吃,睡,工作以及锻炼,但是我懒只想吃和睡* @author Leon.Sun**/
public interface Live {void sleep();void eat();void work();void train();}
package com.learn.adapter;/*** 抽象类* @author Leon.Sun**/
public class LiveDefault implements Live {@Overridepublic void sleep() {}@Overridepublic void eat() {}@Overridepublic void work() {}@Overridepublic void train() {}}
package com.learn.adapter;public class LiveImpl extends LiveDefault {@Overridepublic void eat() {System.out.println("哇,好好吃");}@Overridepublic void sleep() {System.out.println("不想起床");}}

设计模式:适配器模式(Adapter)相关推荐

  1. 3.设计模式--适配器模式(adapter模式)

    1.场景 适配器模式可能是开发人员用的最多的一种设计模式,做后台开发你可能每天都在使用.只是不知道他的名字:现实中的适配器你应该不会陌生,新款的IQOO 8 pro手机充电器已经达到了120w,实际上 ...

  2. C#设计模式——适配器模式(Adapter Pattern)

    一.概述 在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件 ...

  3. Java设计模式-适配器模式Adapter

    定义:"转换接口" 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 我理解的"一个类的接口&q ...

  4. 趣谈设计模式 | 适配器模式(Adapter):如何让现存对象适用于新的环境?

    文章目录 案例:数据线转换器 适配器模式 "补偿"模式 总结 完整代码与文档 案例:数据线转换器 相信对于安卓用户,曾经或多或少都有着因为接口不适配而带来的苦恼.当你在更换手机时, ...

  5. Java设计模式—适配器模式(adapter pattern)

    现在的手机很多都取消了3.5mm的耳机接口,只留下了一个type-c接口.但是我现在只有一个3.5mm圆孔接口的耳机,我不得不通过一个转接线使得3.5mm的耳机变成type-c接口. //Type-C ...

  6. Java代码审计-设计模式-适配器模式

    Java设计模式-适配器模式(Adapter Pattern) 目录 什么是适配器模式 适配器模式的3种类型 JavaSE适配器模式的应用 Struts2适配器模式的应用 适配器模式是一种" ...

  7. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  8. 【设计模式】—— 适配器模式Adapter

    模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...

  9. 『设计模式』适配器模式(Adapter)

    23种设计模式+额外常用设计模式汇总 (持续更新) 适配器模式(Adapter) 适配器模式把一一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. ...

  10. 设计模式(五)适配器模式Adapter(结构型)

    设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库 ...

最新文章

  1. 每日一皮:这年头没点绝活连洗车都不行...
  2. Caffe中Interp层的使用
  3. python 模拟鼠标键盘_python之模拟鼠标键盘动作
  4. python中next(reader)_Python错误self.reader.next()
  5. Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令
  6. 结合JSP与HTML做一个九九乘法表
  7. 确保PHP安全 不能违反的四条安全规则
  8. 【AI视野·今日CV 计算机视觉论文速览 第227期】Fri, 25 Jun 2021
  9. ls -l 显示年份
  10. FPGA常用单位换算
  11. 国内各地图API坐标系统比较与转换
  12. mybatis 之动态SQL
  13. Windows10通过VNC远程连接Ubuntu18.04
  14. 牛皮!竟然有大佬基于 Spring Boot + Vue 开发了一套网易云QQ音乐(附源码)。。。...
  15. 实验八:SQLite数据库操作
  16. ConstraintLayout约束控件详解
  17. C语言实战--解二元一次方程
  18. ET框架6.0Demo运行学习笔记
  19. 哪一类功率放大电路效率最高_高频放大电路原理详解及应用电路汇总
  20. No overload matches this call(vue tsx)

热门文章

  1. [转]Joomla! 1.5中form表单的实现方式
  2. C#生成Excel报表 用MyXls组件生成更完美
  3. 【Findbugs】Findbugs使用指南
  4. HttpURLConnection总结
  5. NOIP2018没有什么新闻
  6. 【译】ES2018 新特性: 正则表达式的 s (dotAll) 标志
  7. es6 babel转码器使用
  8. zabbix的安装监控windows,linux操作流程
  9. NIO入门系列之第4章:缓冲区内部细节
  10. 高性能MySQL-3rd-(六)查询性能优化