Java设计模式 - 适配器模式
概念:
将一个类的接口,转换成客户期望的另一个接口。适配器模式让原来接口不兼容的类可以在一起工作。
解决的问题:
提供类似于中间人的作用:把原本不兼容、不能一起工作的接口组合在一起,使得它们能够在一起正常的工作。
模式结构:
有两种适配器模式:对象适配器和类适配器。
因为类适配器需要使用到多重继承,而Java不支持多重继承,所以本文就只对对象适配器进行解释。
模式中的角色:
Target(目标接口):客户请求的接口。Adapter必须要实现这个接口(也可以是抽象类)。
Adapter(适配器类):实现Target接口,组合用户所需要的类。
Adaptee(被适配者):请求最终的执行者。
UML图:
这种适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何子类,都可以搭配着适配器使用。
情景导入:
某个玩具厂商的用户需要一种能学鸭子叫的玩具鸡,怎么办?
厂商想这还不容易:我只要生产一个玩具鸡的外形,将它的发音功能委托生产玩具鸭的生产线负责。也就是说:外表看上去是玩具鸡,但发音这个功能有玩具鸭实现。
package com.tony.Adapter; /**
* Target接口,接收用户请求。
* 玩具鸡
*/
public interface Chicken { void speak();
}
package com.tony.Adapter; /**
* 玩具鸭接口
* 面向接口编程是一种好习惯
*/
public interface Duck { void speak();
}
package com.tony.Adapter; /**
* Adapter
* 玩具鸡适配器,将发音请求委托给玩具鸭。
*/
public class ChickenAdapter implements Chicken { private Duck duck; public ChickenAdapter(){
duck = new ToyDuck();
}
@Override
public void speak() {
duck.speak();
} }
package com.tony.Adapter; /**
* Adaptee
* 被适配者,请求的真正执行者。
*/
public class ToyDuck implements Duck{ @Override
public void speak() {
System.out.println("I'm duck, ga ga ga...");
} }
package com.tony.Adapter; public class Test {
public static void main(String[] args) {
Chicken toyChicken = new ChickenAdapter();
toyChicken.speak();
}
}
客户使用适配器的过程:
1、客户通过目标接口调用适配器的方法对适配器发出请求。
2、适配器使用被适配者接口吧请求转换成适配者的一个或多个调用接口。
3、客户接受到调用的结果,但并未察觉这一切是适配器在起转换作用。
其实说了这么多都是为了说明一件事:适配器就是将客户的请求委托给其它能够完成该功能的类!只是起到了一个中转的作用!
模式总结:
优点:
提高代码重用率。使原本不能在实际情况下使用的类通过适配器又可以正常工作。
当需求发生改变时,只需要改变被适配者,无需改动其它任何代码。这对客户端是透明的,使得代码更加简洁。
被适配者的任何子类都可以搭配适配器使用。
适用场景:
当两个毫不相关的类需要在一起工作。
需要使用别人的接口而又不想改动自己的代码。
旧系统升级等等。
其他模式:设计模式专栏
参考文献:
《Head First 设计模式》
Java设计模式 - 适配器模式的更多相关文章
- Java设计模式——适配器模式
JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...
- 【设计模式】Java设计模式 - 适配器模式
[设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...
- JAVA 设计模式 适配器模式
用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构
- Java设计模式——适配器模式(Adapter)
目的:把源类型适配为目标类型,以适应客户端(Client)的需求:此处我们把目标接口的调用方视为客户端 使用场景:需要对类型进行由源类型到目标类型转换的场景中 前置条件:已有客户端 //Client ...
- java设计模式——适配器模式 Java源代码
前言:适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作.通常被用在一个项目需要引用一些开源框架来一起工作时,这些框架的内部都有一 ...
- Java设计模式の适配器模式
定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...
- Java设计模式-适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...
- Java设计模式—适配器模式
适配器模式的个人理解: 首先有一个目标角色.一个源角色还有一个适配器角色.我们要做的就是利用适配器角色将源角色转换为目标角色.而目标角色是一个正在良好运行的一个角色. 转换方法: (1) 适配器类继 ...
- Java设计模式06:常用设计模式之适配器模式(结构型模式)
1. Java之适配器模式(Adapter Pattern) (1)概述: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...
随机推荐
- ViewPager+GridView实现首页导航栏布局分页效果
如图是效果图用ViewPager+GridView实现首页导航栏布局分页效果来实现的效果 Demo下载地址:http://download.csdn.net/detail/qq_29774291/96 ...
- CXF和spring整合遇到的问题:No bean named 'cxf' is defined
今天在做ws和spring整合的时候,很不幸的遇到了这个问题,百度了好久,竟然没人遇到这个问题,后来谷歌了一下,都是遇到这个问题的了...在看到一篇文章中提到了cxf.xml,所以我果断的打开这个配置 ...
- Linux学习笔记19-ssh远程管理
远程管理 服务器一般运行在IDC机房中,一般都是通过远程管理方式对服务器进程控制. 常见的远程管理工具: RDP(remote desktop protocol)协议,window远程桌面管理 Tel ...
- Timeline Portfolio - 时间轴作品集效果
这里分享一个超炫的时间轴展示作品集效果.设计师和前端开发人员可以借助这个效果来制作新颖的作品集和个人简历.时间轴专门用来呈现出年代的一系列事件.您可以把这种效果嵌入各种媒体,包括微博,视频和地图,并把 ...
- HTML中input标签的alt属性和title属性的比较
经常用到这两个属性,但是一直没有总结他们的区别.现在我对他们两个的用法做一下总结: 相同点:他们都会飘出一个小浮层,显示文本内容. 不同点: 1.alt只能是元素的属性,而title即可以是元素的属性 ...
- (转)JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce)
JavaScript-性能优化之函数节流(throttle)与函数去抖(debounce) 函数节流,简单地讲,就是让一个函数无法在很短的时间间隔内连续调用,只有当上一次函数执行后过 ...
- Android Activity和Fragment的转场动画
Android Activity和Fragment的转场动画 Activity转场动画 Activity的转场动画是通过overridePendingTransition(int enterAnim, ...
- Ubuntu 16.04 LTS 安装配置 Nginx 1.10.0 Php7.0-FPM
1. 安装Nginx,Php-7.0 ~$ sudo add-apt-repository ppa:nginx/stable ~$ sudo apt-get update ~$ sudo apt-ge ...
- Map集合概述
java集合最后一站之Map,给自己的总结画个句号... Map用于保存具有映射关系的数据. 1.HashMap和Hashtable实现类 HashMap和Hashtable都是Map接口的典型实现类 ...
- 使用mac 终端利用alias设置快捷命令
在终端中输入快捷命令可以提高工作效率,同时可以少记很多命令 如何做: 首先在~/目录下编辑 .bash_profile这个隐藏文件,如果你想直接双击此文件打开编辑的话请在终端输入 Mac 显示隐藏文件 ...