概述

记录了适配器模式的概念以及代码实现

定义


简单来说,适配器模式就是要将一个接口转换成另一个接口,大多数情况都是功能扩展之后用了新的接口,但是底层还是用的过去的接口,需要将新的接口转换成旧的才能使用。
例如我们用的充电器也是一种适配器。下面我会以翻译作为例子来说明适配器模式。

类图


当马布里来中国打球的时候,他并不会说中文,所以讲战术只能说英文那么就需要翻译,翻译也相当于是一个适配器。
Target:说中文战术
Adapter:翻译(适配器)
Adeptee:要适配的类(说英文战术)
翻译就是吧英文翻译成中文。
适配器有类适配器和对象适配器两种,下面详细介绍。

类适配器

还是用上面翻译的例子,现在我的需求是把说英文的接口转换成说中文的。

下面的类就是需要适配的,他现在只会说英文战术

interface SpeakEnglish {void speakEnglish(String name, String tactics);
}
//需要适配的类
public class ForeignPlayer implements SpeakEnglish {@Overridepublic void speakEnglish(String name, String tactics) {System.out.println(name + "说英文:" + tactics + "战术");}
}

目标:

interface SpeakChinese {void speakChinese(String name,String tactics);
}public class NativePlayer implements SpeakChinese{@Overridepublic void speakChinese(String name, String tactics) {System.out.println(name+"说中文:"+tactics+"战术");}
}

类适配器使用继承实现适配器

public class Adapter extends ForeignPlayer implements SpeakChinese {@Overridepublic void speakChinese(String name, String tactics) {super.speakEnglish(name,tactics);System.out.println("翻译成了中文");}
}

Client

public class Client {public static void main(String[] args) {SpeakEnglish foreignPlayer = new ForeignPlayer();SpeakChinese adapter = new Adapter();adapter.speakChinese("马布里","二三联防");}
}

这样,就从SpeakEnglish转换成了SpeakChinese接口

但是实际上这里使用继承实现的
不满足合成复用原则的:尽量使用对象组合,而不是继承来达到复用的目的。
所以下面改进一下,实现对象适配器

对象适配器

使用组合而非继承。要修改的地方并不多:
修改适配器

public class Adapter implements SpeakChinese{private SpeakEnglish foreignPlayer;public Adapter(SpeakEnglish foreignPlayer) {this.foreignPlayer=foreignPlayer;}@Overridepublic void speakChinese(String name, String tactics) {foreignPlayer.speakEnglish(name,tactics);System.out.println("翻译成了中文");}
}

Client:

public class Client {public static void main(String[] args) {SpeakEnglish foreignPlayer = new ForeignPlayer();SpeakChinese adapter = new Adapter(foreignPlayer);adapter.speakChinese("马布里","二三联防");}
}

使用场景

  1. 两个类所做的事情相同或相似,但是具有不同的接口时使用
  2. 系统发展,产生了功能类似但是不同的接口时使用
  3. 所以适配器大多是无奈之举
  4. SpringMVC中HandlerAdapter
  5. AOP中所有的通知都会转化成环绕通知,转化的事Interceptor接口,这里就是用的也是适配器模式。

优点

  1. 提高了代码的复用性,不需要重新写代码,通过适配器就重用已有代码
  2. 解决目标类和适配者类不一致的问题
  3. 能让客户端透明访问目标接口

小结

只有写代码才知道自己是不是真的会了,中间出了好多小问题,比如接口类型只能调用接口类型的方法,继承父类是得不到实例化对象的属性值,实例对象和类完全是两码事。

设计模式学习5——适配器模式相关推荐

  1. 设计模式 - 学习笔记 - 适配器模式AdapterPattern

    设计模式 - 学习笔记 - 适配器模式AdapterPattern 学习总结 UML 代码演示 电源插座 ElectricalSocket 两口插头 Plug USB公口 手机充电器(适配器) Cha ...

  2. 设计模式学习笔记(C++实现)(七)--适配器模式

    1.适配器模式简介 英文名称 Adapter 主要目的 该模式可以将一个类的的接口,转换成客户想要的另一个接口. 使用场景 1.当要使用的两个类功能相同或者相似,但仅仅是接口不同时. 2.适配器模式代 ...

  3. 设计模式学习(三):Adapter适配器模式

    一.什么是Adapter模式 我们先举个例子:如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作,应该怎么做呢?通常,我们会使用适配器,将家庭用的交流220V电压转换成我们所需要的 ...

  4. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  5. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  6. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  7. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  8. 设计模式学习笔记——适配器(Adapter)模式

    设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...

  9. 设计模式学习笔记(目录篇)

    设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三 ...

最新文章

  1. 读微型计算机原理与接口技术 段的理解
  2. 皮一皮:大哥!二弟!三弟!
  3. 解决了一个小问题 好像把逻辑有点复杂
  4. Normalize.css :一种用于重置默认的CSS样式的样式工具
  5. 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
  6. Linux系统修改远程连接22端口
  7. 开课吧:为什么AI工程师都要懂一点架构呢?
  8. python基础:集合操作
  9. A站没落了,付费会员成B站破解盈利难题的最优解?
  10. SQL笔试经典50题及答案解析(题目41-50)
  11. 应急响应-Linux入侵排查
  12. 视频教程-Mikrotik RouterOS 软路由基础教程-网络技术
  13. 广场舞江湖刀光剑影,糖豆APP武艺高强却难打赢中老年擂台?
  14. Java毕业设计——>SpringBoot+VUE实现的前后端分离小米手机商城系统
  15. android平板和ipad区别,iPad和安卓平板差距大吗?亲身经历告诉你,平板该如何挑选...
  16. 数学基础(二)——参数估计与矩阵运算基础
  17. 永磁同步电机高频注入simulink仿真模型下载
  18. 搞机吧 | 刷rec、线刷、卡刷教程
  19. matlab error 15,为什么我遇到了“License Manager Error -15”的错误?
  20. 使用jmc监控远程tomcat

热门文章

  1. cadence16.6 保存闪退问题
  2. Windows ntp详解
  3. 2022.12.7 英语单词背诵
  4. [已失效]批量删除“QQ说说
  5. 顺网科技服务器维修,给网吧新手:顺网科技网维大师9系施工教程
  6. 精彩全记录 100个最佳的Linux站点推荐(一)
  7. STC单片机学习型号选择及哪里购买
  8. 达人评测 r7 7735h和r5 5600h选哪个 锐龙r77735h和r55600h对比
  9. TypeScript 高级用法总结
  10. DAZ使用SmartContent资源管理器