适配器模式

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

适配器模式的用途

适配器模式的用途,在网上找了一幅图,挺形象的:

比方说我有一个台灯,其插头是标准的两相的交流电插头,即阳极、阴极。我旅游到了一个地方想用自己的台灯,但发现旅馆里面只有三相的插头,即在阳极、阴极的基础上还多了一个地级。这时候怎么办呢,一个两相到三相的转换器(适配器)就能解决这个问题了,而这正是本模式所做的事情。

类适配器

适配器模式分两种,类适配器和对象适配器。先讲类适配器,类适配器把适配的类的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:适配器模式的更多相关文章

  1. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  2. Java设计模式之适配器模式(项目升级案例)

    今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...

  3. Java设计模式----初识适配器模式

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  4. Java设计模式应用——适配器模式

    性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功 ...

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

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

  6. Java设计模式中适配器模式的实现方法

    在Java开发中,我们常常需要用到Java接口型模式中的适配器模式,那适配器设计模式到底是什么模式呢? 适配器模式(Adapter)就是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹 ...

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

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

  8. java设计模式之适配器模式

    说到适配器,我们可能会想到电脑的适配器,没错,其实作用是一样的,电脑的适配器在中国可以使用,在美国也可以使用,它的主要作用是在新接口和老接口之间进行适配..这就是一个适配的过程,适配器模式的类图如下: ...

  9. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

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

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

随机推荐

  1. ip地址合法性

    /* * Java语法上正则化表达式的使用技巧,对于'.'要用'\\.' (2)注意空字符串“”和null的区别,判断一个字符串是不是空字符串用.equals("") * (1,判 ...

  2. M2事后分析汇报总结

    学霸网站项目Postmortem结果 M2之于M1的改进 文档和问答的整合 完成webservice 完成数据库触发器设计与完整性约束依赖(大规模) 优化学霸UI 资源的搜索 外部问题的搜索 文档的上 ...

  3. RHEL7学习之NTP配置

    一,安装NTP [root@localhost ~]# yum install ntp Loaded plugins: product-id, subscription-manager This sy ...

  4. PS:缝线颜色随着鞋帮颜色的改变发生改变.files

    1.绘制逼真缝线 (1)新建两个图层,并且命名为“针眼”和“缝线”: (2)选择“铅笔”工具,像素为“2”: (3)在针孔图层上进行缝线路径描边,并双击图层,弹出“图层样式”窗口,选择“斜面与浮雕”- ...

  5. 将ubuntu的id_rsa秘钥转为putty的ppk格式

    1.使用putty的puttygen.exe: 2.导入需要转换的秘钥 3.保存私钥

  6. text-align:justify的使用

    在平常的开发过程中,对于text-align一般用到的是left,center,right,这三个属性都不会陌生.然而,对于justify的使用我却是很陌生.首先有个比较简单的例子. 首先是html代 ...

  7. 远程登录linux不用输入密码的方法

    原创文章,欢迎阅读,未经博主允许禁止转载. ssh免密登录,使用密钥认证.执行以下命令,一路回车,就生成了密钥认证.然后,ssh登录,scp等都不用密码了. $ ssh-keygen -t rsa $ ...

  8. Android adb命令 一

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.adb的工作方式比 ...

  9. css+js回到顶部

    .backToTop { display: none; width: 18px; line-height: 1.2; padding: 5px 0; background-color: #000; c ...

  10. Python成长笔记 - 基础篇 (十二)

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的 ...