• 适配器模式概念

    适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如我们突然就想看电影了,但是这个电影是AVI格式的,目前我们开发的Player播放器只能播放Mp4格式的,那么我们就得对这款落后的Player进行版本升级,通过Adapter适配器就可以实现既可以播放AVI格式的、也可以播放Mp4,这个适配器既可以播放原有的Mp4,也可以提供AVI接口。

    Adapter:适配器

    Adaptee:被适配的对象,就是Player

    Target:客户端理想的接口,就是可以播Mp4,也可以播放AVI接口

  • 类适配器类图

  

  • 类适配器代码
public interface TargetPlayer {
public void playMp4();
public void playAVI();
} public class AdpateePlayer {
public void playMp4(){
System.out.println("can play mp4");
}
} public class Adapter extends AdpateePlayer implements TargetPlayer {
public void playAVI() {
System.out.println("can play avi");
}
} public class AdapterMain {
public static void main(String[] args) {
Adapter adapter=new Adapter();
adapter.playAVI();
adapter.playMp4();
}
}
  • 对象适配器类图

  • 对象适配器代码
public interface TargetPlayer {
public void playMp4();
public void playAVI();
} public interface AdapteePlayer {
public void playMp4();
} public class AdapteePlayerImpl implements AdapteePlayer {
public void playMp4() {
System.out.println("can play mp4");
}
} public class Adapter implements TargetPlayer{
private AdapteePlayer adapteePlayer; public void setAdapteePlayer(AdapteePlayer adapteePlayer) {
this.adapteePlayer = adapteePlayer;
} public void playMp4() {
adapteePlayer.playMp4();
} public void playAVI() {
System.out.println("can play avi");
}
} public class AdapterMain {
public static void main(String[] args) {
Adapter adapter=new Adapter();
AdapteePlayer adapteePlayer=new AdapteePlayerImpl();
adapter.setAdapteePlayer(adapteePlayer);
adapter.playAVI();
adapter.playMp4();
}
}
  • 二者比较

    小编为了突出对象适配器的好,将待适配器对象实现既写了接口又写了实现,很明显对象适配器很灵活,可以动态的传入不同的待适配的对象,而类适配器是静态的类继承,后期不可以修改,很死板。

  • 应用场景 

    适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等。

    以InputStreamReader和OutputStreamWriter类为例。

    InputStreamReader和OutputStreamWriter类分别继承了Reader和writer接口,但是要创建他们的对象必须在构造函数中传入一个InputStream和OutputStream的实例,InputStreamReader和OutputStreamWriter类的作用也就是将InputStream和OutputStream适配到Reader和Writer。

    适配器是InputStreamReader,源角色是InputStream代表的实例对象,目标接口就是Reader类。

    InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。

基于JAVA的设计模式之适配器模式的更多相关文章

  1. 基于java的设计模式入门(1)——为什么要学习设计模式

    大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...

  2. Java常见设计模式之适配器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...

  3. 基于JAVA的设计模式之代理模式

    概念 王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动.王宝强的微博维护.安排王宝强的行程以及什么什么等等.如果王宝强一个人做岂不是累死.通过这个代理人为王宝强节省了 ...

  4. 基于JAVA的设计模式之单例模式

    概念 于大二上学期面向对象C++期中考试中有这么道题:一个Computer有多个USB插口,那么意味着这台电脑可以插多个鼠标,但是无论你如何拔插多少个鼠标,桌面上的鼠标一直只显示一个,且多个硬件鼠标都 ...

  5. 基于JAVA的设计模式之组合模式

    概念 将所有对象组合成一种树形结构,有分支节点.叶子节点,分支节点可以有自己的子节点,子节点可以是分支节点.叶子节点,可以进行增删的操作,而叶子节点不可以.比如文件夹就是一个分支节点,而文件就是一个叶 ...

  6. Java IO设计模式(装饰模式与适配器模式)

    01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...

  7. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  8. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  9. JAVA学习笔记--策略设计模式与适配器模式

    一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...

随机推荐

  1. svn 操作手册

    1.执行下列指令安装    sudo apt-get install subversion   2.  创建版本库       sudo mkdir /home/svn    sudo mkdir / ...

  2. nginx web端口映射

    nginx web端口映射 举例: 问:在一台有外网的宿主机上部署了一个kvm虚拟机,在虚拟机上部署了web,需要外网访问此web,但虚拟机只有内网ip,只和宿主机通,怎么实现外网访问web服务? 答 ...

  3. Eclipse插件:tomcatPluginV33.zip 安装

    一.下载 地址:http://www.eclipsetotale.com/tomcatPlugin.html 二.安装 1.解压tomcatPluginV33.zip到Eclipse的\feature ...

  4. mongodb启动脚本

    #!/bin/sh # #chkconfig: #description: mongodb start() { /usr/local/yunshipei/enterplorer/mongodb/bin ...

  5. 《精通Spring4.X企业应用开发实战》读后感第四章(资源访问)

    package com.smart.resource; import org.springframework.core.io.ClassPathResource; import org.springf ...

  6. SQL中的drop,truncate和delete的区别

    (1)   DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...

  7. Halcon - 获取图像数据(灰度值)

    在 Halcon 中,或许大部分人都知道如何通过 get_grayval 获取图像的灰度值,这条算子在获取单个像素时是比较好用的.但是当你想获取一幅大尺寸图像的一行甚至所有的灰度数据时,它就会变得很吃 ...

  8. keycode和which

    firefox 中不支持keyCode ie9-- 不支持which firefox:上下左右键会触发kepress. chrome: 上下左右键不会触发kepress. oprea:上下左右键不会触 ...

  9. 51nod1100(计算斜率)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1100 题意:中文题啦- 思路:算斜率不用多说吧?本题唯一一个 ...

  10. 关于c语言中的字符串问题

    对字符数组,字符指针,字符串常量 在csdn上看到一篇关于这方面的帖子,有所收获. JohnTitor的专栏 1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写   & ...