适配器模式的定义为:将一个类的接口转换成客户端期望的另一个接口。适配器让原本因为接口不兼容而无法一起工作的类可以一起工作。
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.

适配器模式的意图(Intent)就是为适配目标接口而转换已有的接口,一个adapter可以有多个adaptee,淡然adapter也可增加adaptee没有的功能。

适配器可以有两种版本,一种是对象适配器,adapter与adaptee是HAS-A的关系;另一种是类适配器,adapter继承自adaptee,两种类型各有优缺点。
类适配器需要用到多继承,target的接口需要public继承,而adaptee的实现需要private继承,这样就可已区分adaptee和target了。

根据《Header First Design Patterns》中的介绍,class dapter必须要用到multiple inheritance,这个应该是不对的吧?
因为adapter实现(implement)了target的接口,继承(extend)的是adaptee类,因此没有多继承依然可以实现class adapter。
适配器根据语言的不同可以有不同的用处,比如two-way class adapter只能在支持多继承的语言中使用,two-way class adapter可以把适配多个adaptee,
其本质就是adapter的可以重写实现相同但签名不同的函数

《Header First Design Patterns》中adapter模式的示例代码如下:

其intent是把一个Turkey适配成一个duck。

首先分别定义Duck和Turkey的interface。

public interface Duck {public void quack();public void fly();
}
public interface Turkey {public void gobble();public void fly();
}

然后实现两个接口

public class MallardDuck implements Duck {public void quack() {System.out.println("Quack");}public void fly() {System.out.println("I'm flying");}
}
public class WildTurkey implements Turkey {public void gobble() {System.out.println("Gobble gobble");}public void fly() {System.out.println("I'm flying a short distance");}
}

利用对象适配器把Turkey适配成Duck

public class TurkeyAdapter implements Duck {Turkey turkey;public TurkeyAdapter(Turkey turkey) {this.turkey = turkey;}public void quack() {turkey.gobble();}public void fly() {for (int i = 0; i < 5; i++) {turkey.fly();}}
}

客户使用TurkeyAdapter时调用的都是Duck的方法,动作的主体Trukey实际上对客户端是透明的。

编写测试驱动:

public class DuckTestDrive {public static void main(String[] args) {MallardDuck duck = new MallardDuck();WildTurkey turkey = new WildTurkey();Duck turkeyAdapter = new TurkeyAdapter(turkey);System.out.println("The Turkey says...");turkey.gobble();turkey.fly();System.out.println("\nThe Duck says...");testDuck(duck);System.out.println("\nThe TurkeyAdapter says...");testDuck(turkeyAdapter);}static void testDuck(Duck duck) {duck.quack();duck.fly();}
}

一点小感悟:
学习设计模式必须要搞清楚的一点就是每个模式的意图(Intent),其实有很多模式在实现上都是类似或者交叉的,而具体细微的差别就体现在他们的意图上。
本身中文的逻辑性没有英文好,所以有些句子为了保持逻辑严密性,翻译成中文自然是比较拗口的,所以看懂了并不代表也能把它翻译出来。

【设计模式】之适配器(Adapter)相关推荐

  1. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

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

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

  3. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  4. 如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配

    在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口.它使得原本由于接口不兼容而不能一起工作的那些 ...

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

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

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

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

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

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

  8. JAVA设计模式什么鬼(适配器)——作者:凸凹里歐

    我们这个世界,充满着千奇百怪的对象,更有趣的是对象与对象间是存在着互动,沟通,这样世界才变得美妙.那到底是怎样互动呢?靠什么才能互动呢?是的,接口.比如你和朋友一起喝茶聊天,我们暂且不管声带,耳膜这些 ...

  9. java设计模式adapter,java设计模式-适配器模式(Adapter)

    定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...

  10. apollo学习基础之三[适配器adapter学习]

    apollo学习基础之三[适配器adapter学习] 目录 apollo学习基础之三[适配器adapter学习] 1.适配封装设计 2. AdapterManager的设计 3.总结归纳: 我们知道, ...

最新文章

  1. Matlab问题汇总!
  2. JDK库rt包中常用包说明
  3. 一次前后端分离的实践
  4. Linus Torvalds:我们都老了,但Linux维护者真的很难找
  5. 大屏数据可视化源码_AxureBI数据大屏可视化原型设计软件
  6. csgo手机上看demo_仪表上的车速和手机导航不一样,哪个更准?碰到测速了该看哪个?...
  7. c语言中char buffer,C语言对char*的封装,形成buffer
  8. java方法分为类方法和_— Must we finish copying all these articles this morning? — No, you( )._学小易找答案...
  9. SpringMVC12拦截器
  10. WiFi 抓包工具使用SOP(OmniPeek)
  11. 最新解决vscode中文乱码问题
  12. 分享个手游剑侠情缘2挂机脚本,能够多开刷银两的工具
  13. 计算机cpu温度显示原理,可以相信软件显示的CPU温度吗
  14. Apple应用证书申请过程
  15. Freebase上的SPARQL查询
  16. Python开发 CDN查询子域名查询
  17. HIT-哈工大数据结构-作业1(C++)
  18. 程序员代码中的希腊字母表示
  19. 为什么程序员应该写博客?用什么博客系统?在哪写?
  20. 功能超级强大的计算器程序 免费开源 全部源码

热门文章

  1. 树莓派Linux入门教程
  2. Python随机生成一注双色球彩票
  3. Tree Audio Branch录音 Sophia Pfister - Bad Decisions
  4. 算法可以申请专利么_国内提供计算机视觉(CV)算法岗位的公司名单
  5. html表达式 %3c,避开XSS过滤常用方法
  6. Https 忽略证书验证
  7. tableau制作日历图学习
  8. echarts图表生成图片
  9. 【M】⽴项or申报书中的重点难点咋写?
  10. Linux 如何在 vi 里搜索关键字