通常,在代码已经存在的情况下编写客户端代码(客户端就是需要调用我们代码的对象),开发人员可以采取模拟客户端的方式调用我们提供的接口对象。然而,客户端代码也可能与你的代码单独进行开发,这种情况下,会发现虽然现有代码提供了客户端需要的服务,但被定义成不同的方法名。这时,我们就需要采用适配器模式。适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所需要的接口。

适配器模式可分为两种:

  (1)类适配器

  (2)对象适配器

类适配器:

当我们适配现有代码时,发现客户端开发人员已经考虑到了这种情形,开发人员为客户端使用的服务提供了接口定义。如下:

  1. public interface RequiredInterface {
  2. public void requiredMethod();
  3. }

RequiredInterface接口定义了客户端需要调用的服务方法requiredMethod,在ExsitingClass类中,则定义了usefulMethod方法,它是客户端需要的服务实现。

  1. public class ExistingClass {
  2. public void usefulMethod() {
  3. System.out.println("useful method!!!");
  4. }
  5. }

若要对ExistingClass进行适配,满足客户端需要,则可以创建一个NewClass类,继承ExistingClass,同时继承RequiredInterface接口,通过重写requiredMethod方法将客户端的请求委托给usefulMethod方法,如下:

  1. public class NewClass extends ExistingClass implements RequiredInterface{
  2.  
  3. public void requiredMethod() {
  4. this.usefulMethod();
  5. }
  6. }

                                     图1

图1中的NewClass类就是类适配器的例子。该类的实例同时也是RequiredInterface的实例。换言之,NewClass类满足类客户端的需求。

当客户端在接口中定义了它所期待当行为时,就可以使用类适配器,提供一个实现该接口的类。倘若没有定义客户端的接口,则不能使用类适配器,此时必须使用对象适配器。在类适配器中,新的适配器类实现了定义的接口,同时继承现有类。当你需要适配的方法并非定义在接口中时,这种方法就不凑效类。此时我们可以创建一个对象适配器,使用委托而非继承,如下图所示:

上图中的NewClass是对象适配器的一个例子,该类的实例也是RequiredClass的实例,换言之,NewClass满足了客户端的需要。NewClass通过使用ExistingClass实例对象,可以将ExistingClass类适配为符合客户端的需要。

  1. public class RequiredClass {
  2. public void requiredMethod(){
  3.  
  4. }
  5. }
  6.  
  7. public class NewClass extends RequiredClass {
  8.  
  9. private ExistingClass existingClass = new ExistingClass();
  10.  
  11. @Override
  12. public void requiredMethod() {
  13. existingClass.usefulMethod();
  14. }
  15. }

适配器模式可以是我们重用一个现有的类,以满足客户端的需要。当客户端通过接口表达其需求时,采用类适配器,创建一个实现该接口的类,同时继承现有类。 当客户端没有指定它所需要的接口时,应采用对象适配器,创建一个类使用现有类的实例。如果我们不需要(或者不能)重写客户端可能调用的方法时,这种方式可能存在一定的危险性。

Java设计模式之适配器模式(Adapter)的更多相关文章

  1. Java设计模式之适配器模式(Adapter)

    转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...

  2. java设计模式之六适配器模式(Adapter)

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

  3. 夜话JAVA设计模式之适配器模式(adapter pattern)

    适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...

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

    Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 还有一类是Class Adapter.因为Class Adapter的 ...

  5. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  6. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

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

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

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

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

  9. Java设计模式之适配器模式(项目升级案例)

    今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...

  10. Java设计模式----初识适配器模式

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

随机推荐

  1. Pandas的Categorical Data类型

    pandas从0.15版开始提供分类数据类型,用于表示统计学里有限且唯一性数据集,例如描述个人信息的性别一般就男和女两个数据常用'm'和'f'来描述,有时也能对应编码映射为0和1.血型A.B.O和AB ...

  2. 【JS 移动端】获取设置页面大小

    获取设置页面大小 function getMobileData() { var ismobile = false; browser = { versions: function () { var u ...

  3. stm32CubeMx lwip + freeRTOS

    MCU: STM32F429IGT6 工具:STM32CubeMx  版本号 5.0.0 Keil uVersion5 目的:使用LWIP 实现简单的网络连通 一  简介 LWIP(Light Wei ...

  4. 「AT2381 [AGC015C] Nuske vs Phantom Thnook」

    题目大意 给出一个01矩阵,这个矩阵有一个特殊的性质: 对于任意两个 \(1\) 之间最多只有 \(1\) 条由 \(1\) 构成的路径.每次询问给出一个矩形范围,查询在这个范围内的联通快个数. 分析 ...

  5. Nginx 七层反向代理

    目录 1.代理 2.正向代理 3.反向代理 4.Nginx 反向代理 5.Nginx 反向代理相关指令介绍 ①.listen ②.server_name ③.location ④.proxy_pass ...

  6. 安装oracle11g跳不过下载软件更新[INS-30131] 执行安装程序验证所需的初始设置失败

    链接:https://www.jb51.net/article/88944.htm 问题已解决: 解决方法 第一步: 控制面板>所有控制面板项>管理工具>服务>SERVER 启 ...

  7. Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符

    四.匹配分组   [元字符] 分组符号 a|b   匹配字符a 或 字符b  (如果两个当中有重合部分,把更长的那个放前面) (ab)   匹配括号内的表达式 ,将()作为一个分组 num  引用分组 ...

  8. 「学习笔记」FFT 之优化——NTT

    目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NT ...

  9. 小白笔记:Git入门之常见命令

    安装 这里就不介绍安装了,度娘一大堆,找不到可以去找谷爹(前提是你能找到).安装好就跟着笔记进行下一步 准备工作 首先我们需要一个可以 git 的东西,所以我们需要一个文件夹和一个文件 创建文件夹 t ...

  10. 如何用一个servlet处理多个请求

    一个servlet处理多个请求,原理:利用反射机制获取在selvlet类中的其他方法1.前端页面<%@ page language="java" contentType=&q ...