Java设计模式7:适配器模式
适配器模式
适配器模式说的是,可以把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类可以一起工作。
适配器模式的用途
适配器模式的用途,在网上找了一幅图,挺形象的:

比方说我有一个台灯,其插头是标准的两相的交流电插头,即阳极、阴极。我旅游到了一个地方想用自己的台灯,但发现旅馆里面只有三相的插头,即在阳极、阴极的基础上还多了一个地级。这时候怎么办呢,一个两相到三相的转换器(适配器)就能解决这个问题了,而这正是本模式所做的事情。
类适配器
适配器模式分两种,类适配器和对象适配器。先讲类适配器,类适配器把适配的类的API转换成目标类的API,类适配器所涉及的角色有:
1、目标角色
这是所期待得到的接口
2、源角色
现在需要适配的接口
3、适配器角色
模式的核心,适配器把源接口转换成目标接口
类适配器示例
目标接口,期待得到sampleOperation1()和sampleOperation2()两个方法:
public interface ClassTarget
{
/** 这是源类ClassAdaptee也有的方法 */
public void sampleOperation1(); /** 这是源类ClassAdaptee没有的方法 */
public void sampleOperation2();
}
源角色,只有一个sampleOperation1()方法:
public class ClassAdaptee
{
public void sampleOperation1(){}
}
适配器角色扩展了ClassAdaptee,同时又实现了目标接口。由于ClassAdaptee没有提供sampleOperation()2方法,而目标接口又要求这个方法,因此适配器角色实现了这个方法:
public class ClassAdapter extends ClassAdaptee implements ClassTarget
{
public void sampleOperation2()
{
// 相关代码
}
}
可能有些人一遍看下来不是很明白,这怎么就是一个适配器模式了,解释一下:
1、客户端期待一个接口ClassTarget有sampleOperation1()和sampleOperation2()这两个方法
2、现在我一个类ClassAdaptee里面只有一个sampleOperation1()方法
3、既然ClassTarget要两个方法,我现在的ClassAdaptee只有一个方法怎么办?搞一个适配器,多变出一个sampleOperation2(),就符合ClassTarget的标准了,由于适配器是ClassTarget接口的实现类,所以可以直接使用适配器作为ClassTarget
对象适配器示例
还是一样的,一个目标接口,期待得到sampleOperation1()和sampleOperation2()方法:
public interface ObjectTarget
{
public void sampleOperation1(); public void sampleOperation2();
}
源角色,只有一个sampleOperation1()方法:
public class ObjectAdaptee
{
public void sampleOperation1(){}
}
和类适配器不同的是,对象适配器采用了委派关系将源角色与适配器角色关联:
public class ObjectAdapter
{
private ObjectAdaptee objectAdaptee; public ObjectAdapter(ObjectAdaptee objectAdaptee)
{
this.objectAdaptee = objectAdaptee;
} public void sampleOperation1()
{
this.objectAdaptee.sampleOperation1();
} public void sampleOperation2(){}
}
适配器模式在JDK中的应用及解读
写了这么多种设计模式了,可能适配器模式是最不好理解的一种写法。适配器模式的写法很多,写法越多、模式越不好理解,就越应该抓住模式的核心,像适配器模式的核心就是"把一个类的接口变换成客户端所期待的另一种接口",所以我们可以看一下InputStreaReader和OutputStreamWriter。
比方说InputStreamReader吧,创建InputStreamReader对象的时候必须在构造函数中传入一个InputStream实例,然后InputStreamReader的作用就是将InputStream适配到Reader。很显然,适配器就是InputStreamReader,源角色就是InputStream代表的实例对象,目标接口就是Reader类。
OutputStreamWriter也是类似的方式。
适配器模式的优缺点
优点
1、有更好的复用性。系统需要使用现有的类,但此类接口不符合系统需要,通过适配器模式让这些功能得到很好的复用
2、有更好的扩展性。实现适配器,可以调用自己开发的功能
缺点
过多使用适配器会使得系统非常凌乱,明明调用的是A接口,内部却被适配成了B接口。因此除非必要,不推荐使用适配器,而是直接对系统重构
Java设计模式7:适配器模式的更多相关文章
- java设计模式5——适配器模式
java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...
- Java设计模式之适配器模式(项目升级案例)
今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...
- Java设计模式----初识适配器模式
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Java设计模式应用——适配器模式
性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功 ...
- Java设计模式之适配器模式(Adapter)
转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法 ...
- Java设计模式中适配器模式的实现方法
在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...
- 夜话JAVA设计模式之适配器模式(adapter pattern)
适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容. 1.类适配器模式:通过多重继承来实现适配器功能.多重继承就是先继承要转换的实现类,再实现被转换的接口. 2.对象适配器 ...
- java设计模式之适配器模式
说到适配器,我们可能会想到电脑的适配器,没错,其实作用是一样的,电脑的适配器在中国可以使用,在美国也可以使用,它的主要作用是在新接口和老接口之间进行适配..这就是一个适配的过程,适配器模式的类图如下: ...
- java设计模式之——适配器模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...
- java设计模式之六适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...
随机推荐
- runtime 运行机制
// // HKPerson.h // runtimeDemo1 // // Created by 123 on 16/5/23. // Copyright © 2016年 123. All ...
- 《CODE》读后笔记——第1~13章
1.电筒密谈 Morse code表 文中提到"英语词汇就是一种编码".这句话仿佛有一种哲学思想在里面,万物皆可以以任何形式编码,只是编码的方式和途径不同.有些编码简单易懂易于接受 ...
- Http请求中Content-Type讲解以及在Spring MVC中的应用
引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...
- node学习笔记(三)
//事件驱动events //events是node最重要的模块没有之一,因为node.js本身的架构就是事件式的,而他提供了唯一的接口,所以堪称node.js事件编程的基石; //events几乎被 ...
- 2016某知名互联网公司PHP面试题及答案
1 字符串"\r","\n","\t","\x20"分别代表什么 答案: "\r"代表的含义是: 在 ...
- Mvc模板页
以前学过WEB的应该都知道母版页这个东西,在这里呢,mvc的模板页和WEB中的模板页也是一样的效果和用途. 首先:创建一个项目,控制器,生成Index视图,在生成视图的时候我们选择Razor视图引擎, ...
- Java 第22章 mySQy
下列都是关系型数据库(在数据库中存在行.列) oracle: Oracle公司的产品(被sun公司收购) 中大型项目使用.银行系统.政府办公系统 9i/10g/11g sql server: 微软公司 ...
- iTunes Connect 开发者上手经验(转)
原文:http://www.cnblogs.com/zhw511006/archive/2013/01/15/2860945.html iOS Developer通常需要用到 developer.ap ...
- 微信小程序免费SSL证书https、TLS版本问题的解决方案
微信小程序与第三方服务器通讯的域名5个必要条件1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口2.加ssl证书,也就是https://~~~4.HTTPS 服务器 ...
- Python socket (多线程)
Server 端 code import SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): ""& ...