Adapter Pattern的作用是在不改变功能的前提下转换接口。Adapter分为两类,一类是Object Adapter, 还有一类是Class Adapter。因为Class Adapter的实现须要用到多继承,而Java不支持多继承,所以这里仅仅关注Object Adapter。

在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用。那么假设我们须要维护一些年代比較久远的代码,可能就会面临着没有 Iterator 的窘境。这时候 Adapter Pattern 就派上用场了。以下通过两个样例,说明怎样通过 Adapter Pattern 将 Enumeration 接口与 Iterator 接口相互“转换”。

老代码适配新代码:将Enumeration转换为Iterator

查了一下API文档,发现 StringTokenizer 这个类实现了 Enumeration 接口,那就拿这个来举例吧。如今有需求,须要用 Iterator 的方式来"遍历" StringTokenizer,可是 StringTokenizer类并没有实现 Iterator 接口。因此我们须要编写一个 Adapter,将 Enumeration 接口转换成 Iterator 接口。



class IteratorAdapter implements Iterator {
private Enumeration enume; // 保存 Enumeration 接口实现类 public IteratorAdapter(Enumeration enume) {
this.enume = enume;
} /**
* Enumeartion的hasMoreElements()方法与Iterator的hasNext()方法功能同样,直接调用
*/
@Override
public boolean hasNext() {
return enume.hasMoreElements();
} /**
* Enumeration的next()方法与Iterator的next()方法功能同样,直接调用
*/
@Override
public Object next() {
return enume.nextElement();
} /**
* 因为Enumeration接口中没有此方法,所以扔异常
*/
@Override
public void remove() {
throw new UnsupportedOperationException(); } }

能够看到,我们实际上仅仅是把没有实现的 Iterator 接口里的方法实现托付给了 Enumeration 接口的实现。

Adapter 的用法例如以下:
StringTokenizer st = new StringTokenizer("a b c d e f g");

		// 创建adapter对象,将StringTokenizer对象传进去
IteratorAdapter strTokenAdapter = new IteratorAdapter(st); // 这时候就能够用Iterator的方式遍历没有实现Iterator接口的对象了
while(strTokenAdapter.hasNext()) {
out.println(strTokenAdapter.next());
}

新代码适应老代码:将Iterator转换为Enumeration

反过来的过程就非常easy的了,由于 Enumeration 接口里的方法在 Iterator 中都有定义。



class EnumerationAdapter implements Enumeration {
private Iterator it; public EnumerationAdapter(Iterator it) {
this.it = it;
} @Override
public boolean hasMoreElements() {
return it.hasNext();
} @Override
public Object nextElement() {
return it.next();
} }

像上面 IteratorAdapter 和 EnumerationAdapter 那样把要被适配的对象保存到类的成员变量里的方式,就叫 Object Adapter。而还有一种 Class Adapter则是要求 Adapter 类同一时候继承适配的两方。比方,有一个名为Apple的类和名为Banana的类,它们的public方法不同样。如今想以调用Apple类方法的方式使用Banana类,那么对于 Class Adapter 来说,就应该让 Adapter 同一时候继承 Apple 和 Banana,然后通过
Adapter 完毕方法调用。有兴趣的话能够用C++实现一下试试。

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

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

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

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

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

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

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

  4. 二十四种设计模式:适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  5. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

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

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

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

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

  8. 【UE4 设计模式】适配器模式 Adapter Pattern

    概述 描述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper). 套路 Target(目标抽象类) 目标抽象类定义了客户所需要的接口,可 ...

  9. 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调

    模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...

随机推荐

  1. DHCP的工作原理

    什么是dhcp?它是如何实现的? DHCP称为动态主机配置协议.DHCP服务允许工作站连接到网络并且自动获取一个IP地址.配置DHCP服务的服务器可以为每一个网络客户提供一个IP地址.子网掩码.缺省网 ...

  2. ant学习记录(复制-移动-删除-依赖综合测试)+fileset

    <?xml version="1.0"?> <project name="targetStudy" default="mkdir&q ...

  3. 高级UIKit-06(UIImagePickerController)

    [day07-1-getSystemImage]:获取系统相册 UIImagePickerController图片采集控制器 picker采集者,采摘者 该方法继承自:UINavigationCont ...

  4. maven常见问题汇总

    package阶段得到的是build目录下编译后的类包(jar),install是把这个包和一些maven的元信息(比如pom.xml)复制到本地仓库,assembly一般是把build结果和一些资源 ...

  5. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述

    上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...

  6. Spring整合Hibernate的步骤

    为什么要整合Hibernate?1.使用Spring的IOC功能管理SessionFactory对象 LocalSessionFactoryBean2.使用Spring管理Session对象  Hib ...

  7. Android组件:Fragment切换后保存状态

    之前写的第一篇Fragment实例,和大多数人一开始学的一样,都是通过FragmentTransaction的replace方法来实现,replace方法相当于先移除remove()原来所有已存在的f ...

  8. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  9. JSP 网页格式判定执行哪一块html

    JSP 网页格式判定执行哪一块html <!-- start -->             <td height="166" colspan="3&q ...

  10. Ch03 视图基础

    3.1  视图简介 3.1.1  选择待渲染视图 3.1.2  重写视图名 3.2  给视图传递数据 3.2.1  ViewDataDictionary 3.2.2  ViewBag 3.2.3  带 ...