java设计模式之适配器模式

感谢《Android源码设计模式解析与实战》 何红辉 关爱民 著

适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判断出来,从最早的ListView、GridView、到现在最新的RecyclerView都需要使用Adapter,并且在开发中我们遇到的优化问题、出错概率较大的地方也基本都出自Adapter。

适配器是将两个不兼容的火龙融合在一起,将不同的东西通过一种转换使得它们能够协作起来,例如,经常碰到要在两个没有关系的类型之间进行交互,第一个解决方案是修改各自类的接口,但是如果没有源代码或者我们不愿意为了一个应用而修改各自的接口,这种情况我们往往会使用一个Adapter,这个Adapter会将这两个接口进行兼容,在不修改原有代码的情况下满足需求。

假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口,不用于旧厂商的接口:

你不想改变现有的代码,解决这个问题(也不能改变厂商的代码),应该怎么做?你可以写一个类(适配器),将新厂商接口转接成你所期望的接口,这个适配器工作起来就如同一个中间人,它将客户所发出的请求转换成厂商类能理解的请求。

适配器模式可分为两种:

对象适配器:充满着良好的OO设计原则,使用对象组合,可以应用在适配者是接口和它所有的子类,不能够重写适配器的方法,因为没有继承关系,但是也能够“重新实现”适配者中方法,客户端和适配者完全不相干,只有适配器拥有适配者的引用。

类适配器:使用继承的方式达到适配的工作,只能是适配者是接口,不能利用它子类的接口,当类适配器建立时,它就静态地与适配者关联,适配者作为适配器的基类,所以适配器能够重写适配器中的方法,客户端代码对适配者中声明的代码是可见的客户端代码对适配者中声明的代码是可见的。

定义:

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

使用场景:

1.系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。

2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

3.需要一个统一的输出接口,而输入端的类型不可预知。

UML类图:

首先看下类适配器:

类适配器是通过实现Target接口以及继承Adaptee类来实现接口转换,例如,目标接口需要的是operation2,但是Adaptee对象只有一个operation3,因此就出现了不兼容的情况。此时通过Adapter实现一个operation2函数将Adaptee的operation3转换成Target需要的operation2,以此实现兼容。

Target : 目标角色,也就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。

Adaptee : 现在需要适配的接口。

Adapter: 适配器角色,也是本模式的核心,适配器把源接口转换成目标接口。这一角色不可以是接口,而必须是具体类。

类适配器模式示例:

以大陆电压为220v,手机电压为5v为例

/**
 * 电压类 Target目标
 * @author Administrator
 *
 */
public interface Voltage {
 public int getVoltage();
}public class ChinaVoltage implements Voltage{

 @Override
 public int getVoltage() {
 // 大陆电压为220
 return 220;
 }

}<pre name="code" class="java">/**
 * 手机类, Adaptee 被适配者类
 * @author Administrator
 *
 */
public class PhoneVoltage {
 /**
 * 手机电压为5v
 * @return
 */
 public int getPhoneVoltage(){
 return 5;
 }
}

<pre name="code" class="java">/**
 * 充电器 Adapter 适配器类
 * @author Administrator
 *
 */
public class Charger extends PhoneVoltage implements Voltage {

 @Override
 public int getVoltage() {
 return getPhoneVoltage();
 }

}

public class Client {
 public static void main(String[] args) {
 ChinaVoltage vol = new ChinaVoltage();
 System.out.println("大陆电压为 : " + vol.getVoltage());
 //为手机接入充电器时的电压
 Chargerr character = new Chargerr();
 System.out.println("通过充电器转换后的电压 : " + character.getVoltage());
 }
}

运行结果:
大陆电压为 : 220
通过充电器转换后的电压 : 5

再看一下对象适配器类图:

下面以对象适配器修改Chargerr类

<pre name="code" class="java">/**
 * 充电器 Adapter 适配器类
 * @author Administrator
 *
 */
public class Chargerr implements Voltage{
 private PhoneVoltage phoneV;

 public Chargerr(PhoneVoltage phoneV) {
 this.phoneV = phoneV;
 }

 @Override
 public int getVoltage() {
 return phoneV.getPhoneVoltage();
 }
}

对象适配器实现方式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果,这比类适配器方式更为灵活,它的另一个好处是被适配对象中的方法不会暴露出来,而类适配器由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有,这使得Adapter类出现一些奇怪的接口,用户使用成本较高。因此,对象适配器模式更加灵活、实用。

public class Client {
 public static void main(String[] args) {
// ChinaVoltage vol = new ChinaVoltage();
// System.out.println("大陆电压为 : " + vol.getVoltage());
// //为手机接入充电器时的电压
// Chargerr character = new Chargerr();
// System.out.println("通过充电器转换后的电压 : " + character.getVoltage());
 //被适配者
 PhoneVoltage phoneV = new PhoneVoltage();
 Chargerr chargerr = new Chargerr(phoneV);
 System.out.println("通过充电器转换后的电压:" + chargerr.getVoltage());

 }
 //运行结果:
 // 通过充电器转换后的电压:5
}

总结:
Adapter模式的经典实现在于将原本不兼容的接口融合在一起,使之能够很好地进行合作。但是,在实际开发中,Adapter模式也有一些灵活的实现。例如ListView中的隔离变化,使得整个UI架构变得更灵活,能够拥抱变化。Adapter模式在开发吕运用非常广泛。

优点:

更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点:

过多的使用适配器,会让系统非常零乱,不易速体把握。例如,明明看到调用的昌A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是有必要,可以不使用适配器,而是直接对系统进行重构。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 轻松掌握Java适配器模式

    在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 特点:将两个不兼容的类通过接口实现在一起工作 企业级开发和常用框架中的应用:流接口,例如将字符流转换为字节流输出是用的outputstreamreader 适配器模式分为类适配器和对象适配器: 举例:电脑只有USB接口,但是键盘只有圆口,这时就需要一个适配器,让键盘能输入数据到电脑 类适配器: pac

  • Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比

    Java 适配器模式 最近学习java 基础知识,学习适配器的时候疑惑很多,上网查下资料,对于 Adapter的资料很多,但是比较下本篇不错,这里记录下,大家需要的可以看下. 适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作.从功能上说,这些接口不兼容的类一般具有相同或相似的功能.通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模

  • 初识Java设计模式适配器模式

    [正文] 我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础. 完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式.但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善.希望奋斗在码农路上的童鞋们莫吐槽→_→ 一.适配

  • Java结构型设计模式中的适配器模式与桥接模式解析

    适配器模式 定义 适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起. 有两类适配器模式: 1. 对象适配器模式 - 对象适配器通过关联满足用户期待接口,还降低了代码间的不良耦合.在工作中推荐使用"对象适配". 2. 类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承),java中没有多重继承,所以这里不做介绍. 实现 1. Target - 定义C

  • Java适配器模式定义与用法示例

    本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

  • Java设计模式之适配器模式(Adapter模式)介绍

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用适配器模式 实现Adapter方式,其实"think in Java"的"类再生&quo

  • 实例解析Java设计模式编程中的适配器模式使用

    平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法.有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的.这个时候Adapter模式就会派上用场了. Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种.Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式. 适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器 以下

  • java设计模式笔记之适配器模式

    适配器(Adapter)模式: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 生活中的场景: 1.笔记本电源适配器,可以将220v转化为适合笔记本使用的电压. 2.给笔记本电脑的usb接口插入台式机的ps/2接口的键盘,需要一个usb和ps/2的接口转接器,此时usb和ps/2的接口转接器就充当了适配器的角色. 通用类图: 在上面的通用类图中,Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一

  • Java设计模式之适配器模式简介

    本文举例说明两种适配器模式,即类适配模式和对象适配模式,详情如下: 1.类适配模式: 举个例子来说明:在地球时代,所有坐骑都是只能跑,不能飞的,而现在很多坐骑在地球都可以飞了.假设,地球时代的坐骑只能跑,而现在的坐骑不仅能飞还能跑,我们可以用类适配模式来实现. 这里需要注意的是,适配器继承源类,实现目标接口. 示例代码如下: package adapter; /** * DOC 源 * */ public class Sources { public void run() { System.ou

  • java设计模式之适配器模式(Adapter)

    概述 将一个类的接口转换成用户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 两种实现方式 1.类的适配器模式: 2.对象的适配器模式: 类的适配器模式的UML图,如下: 类的适配器模式把适配的类的API转换成为目标类的API. 上图设计的角色有: 目标角色(Target):这就是所期待得到的接口. 源角色(Adapee):现在需要适配的接口. 适配器角色(Adapter):是本模式的核心,适配器把源接口转换成目标接口. 代码示例: inter

随机推荐