思考题

你能想到真实世界中,还有哪些适配器的例子? P236

  • HDMI 转 VGA 转换器
  • Type-C 转 3.5mm 线

适配器模式解析

客户使用适配器的过程: P241

  1. 客户通过目标接口调用适配器的方法对适配器发出请求
  2. 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
  3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用(客户和被适配者是解耦的,一个不知道另一个

思考题

如果我们也需要一个将鸭子转换成火鸡的适配器,我们称它为 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. 适配器模式的更多相关文章

  1. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  2. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

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

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  4. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

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

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  6. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  7. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  8. C#设计模式之六适配器模式(Adapter Pattern)【结构型】

    一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...

  9. C#设计模式(7)——适配器模式(Adapter Pattern)(转)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

随机推荐

  1. java后端开发学习路线

    思维导图(欢迎克隆):https://www.processon.com/mindmap/5f563cd31e08531762c4e32b 主要包括:编程基础.研发工具.应用框架.运维知识(主要学会配 ...

  2. pandas 处理缺失值(连续值取平均,离散值fillna"<unk>")

    # 2.1处理缺失值,连续值用均值填充 continuous_fillna_number = [] for i in train_null_ix: if(i in continuous_ix): me ...

  3. jquery 执行a 标签 点击事件 跳转href 路径

    <a href="./export.pdf" id="pdfdown" download="文件名.pdf">下载</a& ...

  4. POI2009 KON-Ticket Inspector

    题目链接 Description 一辆火车依次经过 \(n\) 个车站,顺序是 \(1, 2, 3, ..., n - 1, n\).给定 \(A_{i, j}\) 表示从 \(i\) 站上车,\(j ...

  5. AH/HNOI 2017 礼物

    题目链接 描述 两个序列 \(x, y\),可以将一个序列每个值同时加非负整数 \(c\),其中一个序列可以循环移位,要求最小化: \[\sum_{i = 1}^{n}(x_i - y_i) ^ 2 ...

  6. Java集合源码分析(五)——HashMap

    简介 HashMap 是一个散列表,存储的内容是键值对映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashM ...

  7. k8s遇见的问题

    open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory 解决方案   ...

  8. 关于大视频video播放的问题以及解决方案(m3u8的播放)

    在HTML5里,提供了<video>标签,可以直接播放视频,video的使用很简单: <video width="320" height="240&qu ...

  9. python 爬虫库安装

    一键安装python爬虫库 pip3 install requests selenium beautifulsoup4 pyquery pymysql pymongo redis flask djan ...

  10. oracle 常用语句2

    -- number(38) -- char(2000) -- varchar(4000) create table student( sno number(3) primary key, sname ...