概念:

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

解决的问题:

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

模式结构:

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

  因为类适配器需要使用到多重继承,而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. vim退出后终端保留 退出前的内容

    export TERM=linux 或者 具体选项 可以看看secrecrt的选项

  2. oracle的基本数据类型(转载)

    数据类型是在设计表结构中需要定义的,选择适当的数据类型可以节省存储空间,提高运算效率. Oracle数据类型主要包括 1.字符型 适合保存字符串类型的数据,如姓名.地址.简介等等. 如:char(20 ...

  3. MongoDB-query查询接口

    在上一篇中简要使用了C# 对MongoDB进行数据操作,这里补充一些MongoDB query查询条件文档: Query.All("name", "a",&qu ...

  4. PHP 后台定时循环刷新某个页面 屏蔽apache意外停止

    PHP 后台定时循环刷新某个页面 如果间隔时间过长的话  会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...

  5. JavaScript常用技巧总结(持续添加中...)

    在我学习过程中收集的一些常用技巧: typeof x !== undifined 判断x是否已定义: x === Object(x)  判断x是否为对象: Object.keys(x).length ...

  6. Objective-C instancetype关键字

     instancetype是clang 3.5开始,clang提供的一个关键字 表示某个方法返回的未知类型的Objective-C对象 instancetype会告诉编译器当前的类型,这点和NSObj ...

  7. abap 字符串处理

    1).SHIFT:截断字符串 SHIFT {c} [BY {n} PLACES] [{mode}].:      作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则 ...

  8. SharePoint Online 创建门户网站系列之准备篇

    前 言 门户是SharePoint自推出以来,就非常适合的一种站点类型,在Server版本中,发布站点的应用非常广泛.这里,我们以一个个简单的例子,然后以一个固定的项目Demo,为大家演示如何一步步在 ...

  9. 【Leafletjs】5.L.Control 自定义一个Control

    L.Control 所有leaflet控制的基础类.继承自IControl接口. 你可以这样添加控件: control.addTo(map); // the same as map.addContro ...

  10. iOS开发-canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query for scheme xx"

    转载自:http://www.jianshu.com/p/e38a609f786e