Head First 设计模式 —— 07. 适配器模式
思考题
你能想到真实世界中,还有哪些适配器的例子? P236
- HDMI 转 VGA 转换器
- Type-C 转 3.5mm 线
适配器模式解析
客户使用适配器的过程: P241
- 客户通过目标接口调用适配器的方法对适配器发出请求
- 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
- 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用(客户和被适配者是解耦的,一个不知道另一个)
思考题
如果我们也需要一个将鸭子转换成火鸡的适配器,我们称它为 DuckAdapter。请写下这个类。你如何处理飞行方法(毕竟我们知道鸭子飞得比火鸡远)? P242
public class DuckAdapter implements Turkey {
Duck duck;
int count = 0;
public DuckAdapter(Duck duck) {
this.duck = duck;
}
public void gobble() {
duck.quack();
}
public void fly() {
++ count;
if(count == 5) {
count = 0;
duck.fly();
} else {
System.out.println("I'm preparing to fly.");
}
// 答案用的是随机数取模的方法,平均下来每调用5次飞一下
}
}
适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。 P243

特点
- 让客户从实现的接口解耦
P243 - 使用对象组合,以修改的接口包装被适配者
P243 - 把客户和接口绑定起来,而不是和实现绑定起来
P243
思考题
对象适配器(使用组合)和类适配器(使用继承)使用两种不同的适配方法。这两种实现的差异如何影响适配器的弹性? P244
对象适配器
- 更具有弹性,不仅可以适配某个类,还可以适配其任何子类
P247 - 需要一个被适配者的对象,但可动态变更被适配者
- 难以覆盖被适配者的行为,只能通过继承的方式实现
- 只暴露目标接口的行为
类适配器
- 只能适配特定一个类,但不需要重新实现整个被适配者
P247 - 本身就是一个被适配者的对象,但不能动态变更被适配者
- 便于直接在适配器内覆盖被适配者的行为
- 不仅暴露目标接口的行为,也暴露被适配者的行为
思考题
某些交流电适配器所做的事情不只是改变接口,它们还加了一些其他的特性,例如:电涌保护、指示灯、警报声等。
如果要你实现这类特性,你要使用什么模式? P251
- 装饰器模式
所思所想
- 适配器模式也比较常使用,即使没看过设计模式,凭借自己的经验也能写出来,主要目的就是适配不兼容的接口。有一次为了在兼容原有特化搜索接口的基础上,增加一个定制化搜索接口,保证一段时间内两个接口可并存调用,并将一部分特化搜索接口的流量切到定制化搜索接口上,同时又要保证接口调用方无感知,就写了一个适配器,将特化搜索参数转换成定制化搜索的参数,并实现部分流量且切入定制化搜索接口。
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns
Head First 设计模式 —— 07. 适配器模式的更多相关文章
- 每天一个设计模式-3 适配器模式(Adapteer)
每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...
- Head First 设计模式之适配器模式与外观模式
Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...
- C#设计模式(7)——适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- C#设计模式之七适配器模式(Adapter)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
- C#设计模式之六适配器模式(Adapter Pattern)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...
- C#设计模式(7)——适配器模式(Adapter Pattern)(转)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
随机推荐
- mysql中table schema的基本操作
我们通常对数据库进行的增删插检操作,是针对数据库中的文件.mysql数据库中还有一些表(是view,只能做select操作)记录了现有表的meta data,比如某个column的名字,它的定义是什么 ...
- JVM 垃圾回收?全面详细安排!
写在前面: 小伙伴儿们,大家好!今天来学习Java虚拟机相关内容,作为面试必问的知识点,来深入了解一波! 思维导图: image-20201207153125210 1,判断对象是否死亡 我们在进行垃 ...
- Win10新增API
Win10新增API为以下一些方面: Windows.AI Windows.ApplicationModel Windows.Devices Windows.Globalization Windows ...
- 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)
Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...
- STL——容器(List)List 的数据元素插入和删除操作
push_back(elem); //在容器尾部加入一个元素 1 #include <iostream> 2 #include <list> 3 4 using namespa ...
- DVWA各等级命令注入漏洞
漏洞描述 在web程序中,因为业务功能需求要通过web前端传递参数到后台服务器上执行,由于开发人员没有对输入进行严格过滤,导致攻击者可以构造一些额外的"带有非法目的的"命令,欺骗后 ...
- android adb命令* daemon not running.starting it now on port 5037 * 问题解决
输入adb devices却出现了问题daemon not running.starting it now on port 5037, 2. 原因: adb的端口(5037)被占用了.至于这个5037 ...
- 庐山真面目之八微服务架构 NetCore 基于 Dockerfile 文件部署
庐山真面目之八微服务架构 NetCore 基于 Dockerfile 文件部署 一.简介 从今天开始,不出意外的话,以后所写的文章中所介绍项目的部署环境都应该会迁移到Linux环境上,而且是 ...
- Pyhton3 文件拷贝
目录 Pyhton3 文件拷贝 shutil.copy()简单使用说明 Pyhton3 文件拷贝 导入模块shutil,使用模块中的shutil.copy()函数进行文件拷贝 shutil.cop ...
- UWP ListView添加不同样式
先看效果: 使用ListView的ItemTemplateSelector <ListView IsItemClickEnabled="True" ItemContainer ...
