概念:

  将一个类的接口,转换成客户期望的另一个接口。适配器模式让原来接口不兼容的类可以在一起工作。

解决的问题:

  提供类似于中间人的作用:把原本不兼容、不能一起工作的接口组合在一起,使得它们能够在一起正常的工作。

模式结构:

  有两种适配器模式:对象适配器和类适配器。

  因为类适配器需要使用到多重继承,而Java不支持多重继承,所以本文就只对对象适配器进行解释。

  

  模式中的角色:

  Target(目标接口):客户请求的接口。Adapter必须要实现这个接口(也可以是抽象类)。

  Adapter(适配器类):实现Target接口,组合用户所需要的类。

  Adaptee(被适配者):请求最终的执行者。

  UML图:

    

    这种适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。

情景导入:

  某个玩具厂商的用户需要一种能学鸭子叫的玩具鸡,怎么办?

  厂商想这还不容易:我只要生产一个玩具鸡的外形,将它的发音功能委托生产玩具鸭的生产线负责。也就是说:外表看上去是玩具鸡,但发音这个功能有玩具鸭实现。

  

 package com.tony.Adapter;

 /**
* Target接口,接收用户请求。
* 玩具鸡
*/
public interface Chicken { void speak();
}
 package com.tony.Adapter;

 /**
* 玩具鸭接口
* 面向接口编程是一种好习惯
*/
public interface Duck { void speak();
}
 package com.tony.Adapter;

 /**
* Adapter
* 玩具鸡适配器,将发音请求委托给玩具鸭。
*/
public class ChickenAdapter implements Chicken { private Duck duck; public ChickenAdapter(){
duck = new ToyDuck();
}
@Override
public void speak() {
duck.speak();
} }
 package com.tony.Adapter;

 /**
* Adaptee
* 被适配者,请求的真正执行者。
*/
public class ToyDuck implements Duck{ @Override
public void speak() {
System.out.println("I'm duck, ga ga ga...");
} }
 package com.tony.Adapter;

 public class Test {
public static void main(String[] args) {
Chicken toyChicken = new ChickenAdapter();
toyChicken.speak();
}
}

  客户使用适配器的过程:

  1、客户通过目标接口调用适配器的方法对适配器发出请求。

  2、适配器使用被适配者接口吧请求转换成适配者的一个或多个调用接口。

  3、客户接受到调用的结果,但并未察觉这一切是适配器在起转换作用。

  其实说了这么多都是为了说明一件事:适配器就是将客户的请求委托给其它能够完成该功能的类!只是起到了一个中转的作用!

模式总结:

  优点:

    提高代码重用率。使原本不能在实际情况下使用的类通过适配器又可以正常工作。

    当需求发生改变时,只需要改变被适配者,无需改动其它任何代码。这对客户端是透明的,使得代码更加简洁。

    被适配者的任何子类都可以搭配适配器使用。

  适用场景:

    当两个毫不相关的类需要在一起工作。

    需要使用别人的接口而又不想改动自己的代码。

    旧系统升级等等。

  

  其他模式:设计模式专栏  

参考文献:

  《Head First 设计模式》

Java设计模式 - 适配器模式的更多相关文章

  1. Java设计模式——适配器模式

    JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...

  2. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

  3. JAVA 设计模式 适配器模式

    用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构

  4. Java设计模式——适配器模式(Adapter)

    目的:把源类型适配为目标类型,以适应客户端(Client)的需求:此处我们把目标接口的调用方视为客户端 使用场景:需要对类型进行由源类型到目标类型转换的场景中 前置条件:已有客户端 //Client ...

  5. java设计模式——适配器模式 Java源代码

    前言:适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作.通常被用在一个项目需要引用一些开源框架来一起工作时,这些框架的内部都有一 ...

  6. Java设计模式の适配器模式

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

  7. Java设计模式-适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

  8. Java设计模式—适配器模式

    适配器模式的个人理解: 首先有一个目标角色.一个源角色还有一个适配器角色.我们要做的就是利用适配器角色将源角色转换为目标角色.而目标角色是一个正在良好运行的一个角色. 转换方法: (1)  适配器类继 ...

  9. Java设计模式06:常用设计模式之适配器模式(结构型模式)

    1. Java之适配器模式(Adapter Pattern) (1)概述:    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...

随机推荐

  1. pageEncoding的默认设置

    windows-->preference-->myeclipse-->files and editors-->jsp 右侧 Encoding 选择  ISO 10646/Uni ...

  2. 如何安装node.js支持插件

    在eclipse插件中,node.js插件中比较知名的是nodeclipse. 从HBuilder6.3起,工具-插件安装,可直接选择nodeclipse插件安装.安装完毕后重启HBuilder新建n ...

  3. PostgreSQL获取年月日

    1.获取当前日期的年份 select to_char(t.detect_date,'YYYY') select extract(year from now())为double precision 格式 ...

  4. 一个bug

    bug原因: maven的project重新更新了一下project name,然后在更新过程中,卡死了,就强制退出.结果,就再也进不去eclipse了.看了eclipse的启动日志,各种报错,找不到 ...

  5. Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

    中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾 ...

  6. Koala – 开源的前端预处理器语言图形编译工具

    koala 是一个前端预处理器语言图形编译工具,支持 Less.Sass.Compass.CoffeeScript,帮助 Web 开发者更高效地使用它们进行开发.跨平台运行,完美兼容 Windows. ...

  7. javascript中数组的常用方法

    数组的基本方法如下 1.concat() 2.join() 3.pop() 4.push() 5.reverse() 6.shift() 7.sort() 8.splice() 9.toString( ...

  8. Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)

    上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...

  9. Delphi 获取系统时间后格式化输出

    问题:客户现场程序运行提示时间格式不对导致的错误,原因是与开发环境及公司内部测试环境的日期格式不一致: 解决:统一强制转换: //引用单元:SysUtils //目的:实现跨环境兼容不同日期格式,如果 ...

  10. 微信 小程序 drawImage wx.canvasToTempFilePath wx.saveFile 获取设备宽高 尺寸问题

    以下问题测试环境为微信开发者0.10.102800,手机端iphone6,如有不对敬谢指出. 根据我的测试,context.drawImage,在开发者工具中并不能画出来,只有预览到手机中显示. wx ...