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

适配器模式可分为两种:

  (1)类适配器

  (2)对象适配器

类适配器:

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

public interface RequiredInterface {
public void requiredMethod();
}

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

public class ExistingClass {
public void usefulMethod() {
System.out.println("useful method!!!");
}
}

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

public class NewClass extends ExistingClass implements RequiredInterface{

    public void requiredMethod() {
this.usefulMethod();
}
}

                                     图1

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

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

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

public class RequiredClass {
public void requiredMethod(){ }
} public class NewClass extends RequiredClass { private ExistingClass existingClass = new ExistingClass(); @Override
public void requiredMethod() {
existingClass.usefulMethod();
}
}

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

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. pip-9.0.1更新到pip-10.0.1遇到的问题

    使用 pip 安装第三方库时,报错: You are using pip version 9.0.3, however version 10.0.1 is available. You should ...

  2. ES查询不重复的数据

    GET ana-apk/_search #查询不重复的mac地址{  "size": 10,  "aggs": {    "MAC": {  ...

  3. Dart语言学习(十三) Dart Mixins 实现多继承

    Mixins Mixins(混入功能)相当于多继承,也就是说可以继承多个类,使用with关键字来实现Mixins的功能. 那么多个类中有相同的方法时候,会被覆盖吗?覆盖的先后是什么? class A{ ...

  4. Linux运维工程师简历项目经验

    如何做好一个合格的运工程师,运维工程师前景怎么样呢?就这些问题,与大家交流一下.首先对于运维工程师的要求是十分严苛的了,运维工程师不但要针对不同的问题做出响应,而且需要不断的补充自己的知识面,并不继提 ...

  5. MessageBox函数

    <Windows程序设计>(第五版)(美Charles Petzold著) https://docs.microsoft.com/zh-cn/windows/desktop/apiinde ...

  6. 动态设置WX滚动条的高度(非常重要)

    wxml: <scroll-view class="scroll" scroll-y="true" style="height:{{client ...

  7. ls命令与cd命令

    ls命令用于显示文件目录列表,当使用ls命令时,默认显示的只有非隐藏文件或文件夹(隐藏文件在linux中前面有 ' . ' ),当不加参数时,显示当前目录. 1.ls命令语法 ls [参数][目标文件 ...

  8. Linux centos7 linux任务计划cron、chkconfig工具、systemd管理服务、unit介绍、 target介绍

    一.linux任务计划cron crontab -u  -e -l -r 格式;分 时 日 月 周 user command 文件/var/spool/corn/username 分范围0-59,时范 ...

  9. 在PyCharm中自动添加文件头、时间日期等信息

    初次安装使用PyCharm,在新建.py文件时会发现文件头并没有什么信息,因此,使用模板会比较方便.方法如下: 1.打开PyCharm,选择File--Settings 2.依次选择Editor--- ...

  10. VMware 设置共享文件夹

    1. 打开: 虚拟机 -> 设置 -> 选项 2. 选择 “总是启用” ,然后点 “添加” 选择你要共享的本地文件夹,最后点确定. 3. Linux下在 /mnt/hgfs 文件夹下就可以 ...