设计模式学习5——适配器模式
概述
记录了适配器模式的概念以及代码实现
定义
简单来说,适配器模式就是要将一个接口转换成另一个接口,大多数情况都是功能扩展之后用了新的接口,但是底层还是用的过去的接口,需要将新的接口转换成旧的才能使用。
例如我们用的充电器也是一种适配器。下面我会以翻译作为例子来说明适配器模式。
类图
当马布里来中国打球的时候,他并不会说中文,所以讲战术只能说英文那么就需要翻译,翻译也相当于是一个适配器。
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("马布里","二三联防");}
}
使用场景
- 两个类所做的事情相同或相似,但是具有不同的接口时使用
- 系统发展,产生了功能类似但是不同的接口时使用
- 所以适配器大多是无奈之举
- SpringMVC中HandlerAdapter
- AOP中所有的通知都会转化成环绕通知,转化的事Interceptor接口,这里就是用的也是适配器模式。
优点
- 提高了代码的复用性,不需要重新写代码,通过适配器就重用已有代码
- 解决目标类和适配者类不一致的问题
- 能让客户端透明访问目标接口
小结
只有写代码才知道自己是不是真的会了,中间出了好多小问题,比如接口类型只能调用接口类型的方法,继承父类是得不到实例化对象的属性值,实例对象和类完全是两码事。
设计模式学习5——适配器模式相关推荐
- 设计模式 - 学习笔记 - 适配器模式AdapterPattern
设计模式 - 学习笔记 - 适配器模式AdapterPattern 学习总结 UML 代码演示 电源插座 ElectricalSocket 两口插头 Plug USB公口 手机充电器(适配器) Cha ...
- 设计模式学习笔记(C++实现)(七)--适配器模式
1.适配器模式简介 英文名称 Adapter 主要目的 该模式可以将一个类的的接口,转换成客户想要的另一个接口. 使用场景 1.当要使用的两个类功能相同或者相似,但仅仅是接口不同时. 2.适配器模式代 ...
- 设计模式学习(三):Adapter适配器模式
一.什么是Adapter模式 我们先举个例子:如果想让额定工作电压是直流12V的笔记本电脑在交流220V的电源下工作,应该怎么做呢?通常,我们会使用适配器,将家庭用的交流220V电压转换成我们所需要的 ...
- java/android 设计模式学习笔记(6)---适配器模式
这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- 设计模式学习笔记清单
设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累. ...
- 步步为营 .NET 设计模式学习笔记系列总结
设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...
- 设计模式学习笔记——适配器(Adapter)模式
设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...
- 设计模式学习笔记(目录篇)
设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1 设计模式学习笔记(一:命令模式) 2 设计模式学习笔记(二:观察者模式) 3 设计模式学习笔记(三 ...
最新文章
- 读微型计算机原理与接口技术 段的理解
- 皮一皮:大哥!二弟!三弟!
- 解决了一个小问题 好像把逻辑有点复杂
- Normalize.css :一种用于重置默认的CSS样式的样式工具
- 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
- Linux系统修改远程连接22端口
- 开课吧:为什么AI工程师都要懂一点架构呢?
- python基础:集合操作
- A站没落了,付费会员成B站破解盈利难题的最优解?
- SQL笔试经典50题及答案解析(题目41-50)
- 应急响应-Linux入侵排查
- 视频教程-Mikrotik RouterOS 软路由基础教程-网络技术
- 广场舞江湖刀光剑影,糖豆APP武艺高强却难打赢中老年擂台?
- Java毕业设计——>SpringBoot+VUE实现的前后端分离小米手机商城系统
- android平板和ipad区别,iPad和安卓平板差距大吗?亲身经历告诉你,平板该如何挑选...
- 数学基础(二)——参数估计与矩阵运算基础
- 永磁同步电机高频注入simulink仿真模型下载
- 搞机吧 | 刷rec、线刷、卡刷教程
- matlab error 15,为什么我遇到了“License Manager Error -15”的错误?
- 使用jmc监控远程tomcat