博客
关于我
对象适配器
阅读量:181 次
发布时间:2019-02-28

本文共 1918 字,大约阅读时间需要 6 分钟。

一 点睛

实现方式:对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。

二 需求

读卡器:使用对象适配器模式将读卡器的案例进行改写。

三 类图

在这里插入图片描述

四 代码

在类适配器模式的代码的基础上,我们只需要修改适配器类(SDAdapterTF)和测试类。

// 创建适配器对象(SD兼容TF)public class SDAdapterTF  implements SDCard {       private TFCard tfCard;    public SDAdapterTF(TFCard tfCard) {           this.tfCard = tfCard;    }    public String readSD() {           System.out.println("adapter read tf card ");        return tfCard.readTF();    }    public void writeSD(String msg) {           System.out.println("adapter write tf card");        tfCard.writeTF(msg);    }}// 测试类public class Client {       public static void main(String[] args) {           Computer computer = new Computer();        SDCard sdCard = new SDCardImpl();        System.out.println(computer.readSD(sdCard));        System.out.println("------------");        TFCard tfCard = new TFCardImpl();        SDAdapterTF adapter = new SDAdapterTF(tfCard);        System.out.println(computer.readSD(adapter));    }}

五 测试结果

SDCard read msg : hello word SD===============adapter read tf cardTFCard read msg : hello word TFcard

六 说明

注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方法。而此时我们只需要继承该抽象类即可。

七 应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

八 JDK源码解析

Reader(字符流)、InputStream(字节流)的适配使用的是InputStreamReader。

InputStreamReader继承自java.io包中的Reader,对他中的抽象的未实现的方法给出实现。

public int read() throws IOException {       return sd.read();}public int read(char cbuf[], int offset, int length) throws IOException {       return sd.read(cbuf, offset, length);}

如上代码中的sd(StreamDecoder类对象),在Sun的JDK实现中,实际的方法实现是对sun.nio.cs.StreamDecoder类的同名方法的调用封装。类结构图如下:

在这里插入图片描述

从上图可以看出:

  • InputStreamReader是对同样实现了Reader的StreamDecoder的封装。
  • StreamDecoder不是Java SE API中的内容,是Sun JDK给出的自身实现。但我们知道他们对构造方法中的字节流类(InputStream)进行封装,并通过该类进行了字节流和字符流之间的解码转换。

结论:

​从表层来看,InputStreamReader做了InputStream字节流类到Reader字符流之间的转换。而从如上Sun JDK中的实现类关系结构中可以看出,是StreamDecoder的设计实现在实际上采用了适配器模式。

转载地址:http://dwhj.baihongyu.com/

你可能感兴趣的文章
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
Mysqldump参数大全(参数来源于mysql5.5.19源码)
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>