每天一个设计模式-3 适配器模式(Adapteer)
每天一个设计模式-3 适配器模式(Adapteer)
1.现实中的情况
旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线。好了,今天的学习主题出来了“适配器”。

2.联系编程
有一个电源类,一个旧的硬盘类,还有一个新硬盘类;电源类能直接适配旧硬盘类,但不能和新硬盘适配。
这时,可以添加一个适配器类,这里采用对象引用的方式实现适配器。
3.类图
模式简图:

测试时使用的类图:

UML类图讲解:http://blog.csdn.net/tianhai110/article/details/6339565
4.代码
NewDiskApi:
public interface NewDiskApi {
public void InstallNewDisk();
}
NewDiskApi
NewDisk:
public class NewDisk implements NewDiskApi {
public NewDisk(){
}
public void finalize() throws Throwable {
}
public void InstallNewDisk(){
System.out.println("安装新磁盘");
}
}
NewDisk
OldDiskApi:
public interface OldDiskApi {
public void InstallthisDisk();
}
OldDiskApi
OldDisk:
public class OldDisk implements Computer {
public OldDisk(){
}
public void finalize() throws Throwable {
}
public void installDisk(){
System.out.println("安装旧磁盘");
}
}
OldDisk
Adapter:
public class Adapter implements Computer {
private NewDiskApi newDiskApi;
public Adapter(NewDiskApi newDiskApi){
this.newDiskApi = newDiskApi;
System.out.println("因为不支持新磁盘,所以使用了"+this.getClass().getName());
}
public void finalize() throws Throwable {
}
public void installDisk(){
newDiskApi.InstallNewDisk();
}
}
Adapter
Client:
public class Client {
public Client(){
}
public void finalize() throws Throwable {
}
public static void main(String[] args){
Computer oldDisk = new OldDisk();
oldDisk.installDisk();
Computer newDisk = new Adapter(new NewDisk());
newDisk.installDisk();
}
}
Client
测试结果:
安装旧磁盘
因为不支持新磁盘,所以使用了Adapter
安装新磁盘
5.模式讲解
适配器模式的主要功能就是转换匹配,复用已有功能,但并不是说,在适配器里面就不能实现其他功能,相反,适配器里面可以将多个模块的方法组合来完成一个功能,称这种适配器为智能适配器。
适配器模式可以被实现主要是通过对象引用(Adaptee在这里指的是newDiskApi)方式使不兼容的接口兼容(通过Adapter).
还有一种适配方式是缺省适配:
为一个接口提供缺省实现。然后通过继承这个缺省对象,让子类有选择的覆盖实现需要用的方法。
注意:使用适配器模式有一个潜在的问题,就是被适配的对象(就是被Adapter适配的newDiskApi)不再兼容Adaptee的接口,因为适配器只实现了Target(在这里就是上面的Computer,如果Adapter也实现了newDiskApi就不存在这样的问题了).这导致并不是所有Adaptee对象可以被使用的地方都能使用适配器。
双向适配器:
双向适配器就是适配器类分别实现了不同的Adateee(联系例子指的就是newDisk),并通过对象引用不同的Adaptee,此时的适配器可以同时当作Target和Adapter来使用,下面使用类图来表示也许更好理解一点:

6.适配器模式的优缺点
优点:
更好的复用性:如果功能已经被实现,只是接口不兼容,可以通过适配器模式解决。更好的可扩展性:实现适配器功能时,也可以调用自己开发的功能,从而很自然的扩展系统。
缺点:
过多使用适配器模式,可能会使系统变得非常混乱,不容易整体把握。
7.总结
转换匹配,复用功能适配器里面引用的对象是实现的核心,在适配器内部调用不兼容的接口对象,屏蔽了不兼容接口对象与Target的直接交互,所以达到了适配的目的。
---------博主写博客不容易,转载注明出处,谢谢:http://www.cnblogs.com/xiemubg/p/5951159.html
每天一个设计模式-3 适配器模式(Adapteer)的更多相关文章
- Head First 设计模式之适配器模式与外观模式
Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...
- C#设计模式(7)——适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- C#设计模式之七适配器模式(Adapter)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
- C#设计模式之六适配器模式(Adapter Pattern)【结构型】
一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...
- C#设计模式(7)——适配器模式(Adapter Pattern)(转)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
随机推荐
- android_m2repository_rxx.zip下载地址以及MD5
地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E646 ...
- iOS 原生地图地理编码与反地理编码
当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 ...
- Android之SharedPreferences数据存储
一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...
- Atiti.大企业病与小企业病 大公司病与小公司病
Atiti.大企业病与小企业病 大公司病与小公司病 1. 大企业病,一般会符合机构臃肿 .多重领导 .人才流失的特点.1 2. 大企业病避免方法1 3. 小企业病 1 3.1.1. 表现1 4. 如何 ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...
- win7,Mindmanager2012使用模板时弹出Runtime error R6025解决方法
Mindjet.MindManager2012.v10.0在应用个别模板时提示"参数错误",然后自动关闭. 解决办法: 如果是win7系统,可以进入C:\Users\(用户名)\A ...
- 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D
在CSDN上看到了<搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源>(http://www.csdn.net/article/2013-11-21/2817585-cha ...
- Webgl的2D开发方案(一)spritebatcher
使用TypeScript 和 webgl 开发 第一步:实现了SpriteBatcher 例子如下 http://oak2x0a9v.bkt.clouddn.com/test/index.html ...
- ABP教程-给项目添加SwaggerUI,生成动态webapi
上一篇,我们是正式将ABP生成的代码项目,跑起来了,然后演示了下多租户的不同.那么这篇我们就来实现下SwaggerUI. Q:SwaggerUI是干什么的呢? A:他是一个能将我们的webapi,通过 ...
- ABP源码分析四十三:ZERO的本地化
ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种语言 ...