Java程序设计模式系列之适配器模式

理解适配器设计模式需要从生活中的场景进行联系,在生活当中有那些东西能够称为适配器呢?从字面上理解,“适配”的意思就是让一个东西和另一个东西配对,能够让他们一起工作,比如大家用的笔记本电脑就需要用到电源适配器,转换插口和电流到笔记本上给笔记本电脑进行供电。再比如在国内所有的电器插座都是两口或三口的国内标准插座,但如果到中国大陆以外的地区旅行,想要使用电源给电子产品供电,就需要转换插口了。比如王老师到了香港,看到的电源插座是这样的:

很明显,从国内带去的手机就无法充电了。

那么这个问题怎么解决呢?

经过查找资料,王老师找到了一种产品,它就是长成这个样子的东东,叫“电源适器”。

用法相信大家一看就清楚了。

有个它,妈妈再也不用担心我担心我没有电了。

“哦!我知道了,这不是个转换口吗?”是的,其实跟读卡器的概念是一样的,就是将原本不能用的接口经过适配器转换成能用的接口。

概念:

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

“还是没读懂!”不要紧,下面简单易懂的案例+代码,让你明白什么是适配器模式。

接下来我们就以电源这个案例来介绍适配器模式:

这里有两个不兼容的接口,电源A接口和电源B接口,并且有各自相应的实现方法。代码如下:

那么两个接口应该有各自的实现类,代码如下:

接下来就应该是客户端来调用了,先定义电源A开始工作方法:

那么想要调用start方法就需要传入PowerA的实现类对象了。

所以这里我们创建一个PowerAImpl对象,并且调用start方法。

编译后运行的结果是这样滴:

我们这里已经写好了,如果这时我们想传PowerB接口到start方法可以吗?怎么办呢?

那么此时我们有两种办法来实现,第一种:

再添加一个startB方法,但这不是一个好的解决方案,因为在startA中调用insert方法的前后我们可能存在一些逻辑以及业务,同样的在startB中调用connect方法的前后可能存在这些相同的逻辑及业务,就只有connect方法调用这一句不同,那么重写一份就是多余的了,代码重复了。不太符合我们面向对象的编程思想,怎么办呢?往下看。

接下来看第二种解决方案:我们还是想用一个start方法解决这个问题,到这里会有人想到直接把start方法改成适应两个接口的,王老师在此处需要先给大家说明一个问题了,面向对象的编程原则中有一点非常重要的是“对修改关闭,对扩展开放”,如果我们的程序已经上线运行,当时并没有考虑要传PowerB接口进来,只传PowerA接口就好了,但现在业务修改要求也可以传PowerB接口,那么修改方法将对其他已写好的程序造成怎样的影响也是未知的,可能其他小伙伴调用了你的start方法就会出问题了,也就是说调用了你的start方法的代码都会有连锁反应了。OK!看下面!

我们需要实现这样的东东。

很显然这样的代码编译是不会通过的,因为目前PowerA和PowerB本来就是两个不同的接口,相当于一个三口的插座和一个两口的根本插不进入是一样的。

要想实现转换,现在需要适配器啦!我们需要把PowerB转换成PowerA传进来,那么我们就给PowerA做一个适配器。

1、首先要适配的是PowerA,所以实现PowerA接口,那么PowerAAdapter就可以作为PowerA的实现类传进start方法了。

2、我们是要用这个适配器将PowerB转成PowerA,那么就需要和PowerB取得联系,所以定义一个PowerB作为属性,并通过构造方法进行初始化操作。

3、实现了PowerA接口需要重写其方法,那么在重写的insert方法中调用PowerB的connect方法,适配器就写好了。

现在来测试一下:

编译之后运行结果是这样滴:

结果说明PowerB接口的实现类开始工作了,但传参数的时候是通过PowerA接口的形式传进来进行工作的。这就是神奇的适配器模式啦!

按照步骤敲一敲代码!更有助于理解!

时间: 2024-10-17 01:59:41

Java程序设计模式系列之适配器模式的相关文章

C#设计模式系列:适配器模式(Adapter)

在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作,适配器模式提供了一种接口的适配机制. 适配器模式的设计思想在生活中经常会应用到,如我们在给手机充电的时候,不可能直接在220V电源上直接充电,而是用手机充电器转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个充电器就起到了适配的作用. 1.适配器模式简介 1.1>.定义 适配器模式是通

Java程序员系列之Java基础

转型之后,开始进入了学习时间,下面是整理的学习笔记C#和java之间的一些差异 1.== 和equals 在C# 中字符串的比较是可以 == 去比较的,但在java中使用 == 一直都是false,原来在java中 == 是用来查看两个引用是不是指向同一个内存地址,equals是比较对象的值是否相等,总所周知字符串是引用类型的 2.switch的区别 在C#中Case 后有输出语句,必须匹配break,可以支持long和string类型的key判断 但在Java中case后没有break则执行下

Java描述设计模式(07):适配器模式

本文源码:GitHub·点这里 || GitEE·点这里 一.适配器模式简介 1.基础概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.适配器模式有类适配器模式和对象适配器模式,以及缺省(接口)适配器,三种不同的形式. 2.生活场景 基于适配器模式,把220V的电压,转换为需要的110V电压. public class C01_InScene { public static void main(String[] args)

Java 设计模式系列(六)适配器模式

Java 设计模式系列(六)适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的结构: 类的适配器模式 对象的适配器模式 一.类适配器模式 类的适配器模式把适配的类的 API 转换成为目标类的 API. 在上图中可以看出,Adaptee 类并没有 sampleOperation2() 方法,而客户端则期待这个方法.为使客户端能够使用 Adaptee 类,提供一个中间环节,即类 Adapter,把 Adap

Java 设计模式系列(二三)访问者模式(Vistor)

Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 一.访问者模式结构 访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化. 数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作.这样的过程叫做"双重分派

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

《JAVA设计模式》之适配器模式

<JAVA与模式>之适配器模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 下面是两个非常形象的例子

设计模式总结篇系列:适配器模式(Adapter)

网上看到不少关于适配器模式的讲解,其中对于适配器模式解释的过于专业,一时不是特别理解适配器模式到底是用来干嘛的,具体的适用场景在哪,其最精髓的地方到底在哪. 本文结合自己的理解,阐述下对适配器模式的看法. 假设系统存在一个现有的类UserInfo: 1 class UserInfo { 2 3 private Map<String, String> userBaseInfo; 4 5 public Map getUserBaseInfo() { 6 return userBaseInfo; 7

Java 设计模式系列(五)单例模式

Java 设计模式系列(五)单例模式 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 一.懒汉式单例 /** * 懒汉式单例类.在第一次调用的时候实例化自己 * 1. 构造器私有化,避免外面直接创建对象 * 2. 声明一个私有的静态变量 * 3. 创建一个对外的公共静态方法访问该变量,如果没有变量就创建对象 */ public class Singleton { private Singleton() throws InterruptedException { Thre