关于网站建设的案例分析,装饰网站建设公司,菏泽市住房和建设局网站,马鞍山网站开发流程文章目录 一、适配器模式的运用1.1 介绍1.2 适配器模式结构1.3 类适配器模式1.3.1 类适配器模式类图1.3.2 代码 1.4 对象适配器模式1.4.1 对象适配器模式类图1.4.2 代码 1.5 应用场景1.6 JDK源码解析1.6.1 字节流到字符流的转换类图1.6.2 部分源码分析1.6.3 总结 一、适配器模式… 文章目录 一、适配器模式的运用1.1 介绍1.2 适配器模式结构1.3 类适配器模式1.3.1 类适配器模式类图1.3.2 代码 1.4 对象适配器模式1.4.1 对象适配器模式类图1.4.2 代码 1.5 应用场景1.6 JDK源码解析1.6.1 字节流到字符流的转换类图1.6.2 部分源码分析1.6.3 总结 一、适配器模式的运用
1.1 介绍
将一个类的接口转换成客户希望的另外一个接口使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
例子手机充电器将220v转换为65v的电压读卡器笔记本电脑的充电器等其实就是使用到了适配器模式。
1.2 适配器模式结构
目标Target接口当前系统业务所期待的接口它可以是抽象类或接口。适配者Adaptee类它是被访问和适配的现存组件库中的组件接口。适配器Adapter类它是一个转换器通过继承或引用适配者的对象把适配者接口转换成目标接口让客户按目标接口的格式访问适配者。
1.3 类适配器模式
实现方式定义一个适配器类来实现当前系统的业务接口同时又继承现有组件库中已经存在的组件。
1.3.1 类适配器模式类图
现有一台电脑只能读取SD卡而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器将TF卡中的内容读取出来。 1.3.2 代码
类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用反之不可用。
/*** 适配者类的接口*/
public interface TFCard {// 从TF卡中读取数据String readTF();// 往TF卡中写数据void writeTF(String msg);
}/*** 适配者类*/
public class TFCardImpl implements TFCard {public String readTF() {String msg TFCard read msg I am TFcard;return msg;}public void writeTF(String msg) {System.out.println(TFCard write msg : msg);}
}/*** 目标接口*/
public interface SDCard {// 从SD卡中读取数据String readSD();// 往SD卡中写数据void writeSD(String msg);
}/*** 具体的SD卡*/
public class SDCardImpl implements SDCard {public String readSD() {String msg SDCard read msg I am SD;return msg;}public void writeSD(String msg) {System.out.println(SDCard write msg msg);}
}/*** 适配器类*/
public class SDAdapterTF extends TFCardImpl implements SDCard {public String readSD() {System.out.println(adapter read tf card...);return readTF();}public void writeSD(String msg) {System.out.println(adapter write tf card...);writeTF(msg);}
}/*** 电脑类读取SD卡*/
public class Computer {// 从SD卡中读取数据public String readSD(SDCard sdCard) {if(sdCard null) {throw new NullPointerException(读卡错误请检查SD卡是否插入);}return sdCard.readSD();}
}/*** 客户Client*/
public class Client {public static void main(String[] args) {// 创建电脑对象Computer computer new Computer();// 未定义适配器类电脑只能读取SD卡中的数据String msg computer.readSD(new SDCardImpl());System.out.println(msg);// 定义适配器类使用该电脑读取TF卡中的数据String msg1 computer.readSD(new SDAdapterTF());System.out.println(msg1);}
}// 输出结果
// SDCard read msg I am SD
// adapter read tf card...
// TFCard read msg I am TFcard1.4 对象适配器模式
实现方式对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中该类同时实现当前系统的业务接口。
1.4.1 对象适配器模式类图
现有一台电脑只能读取SD卡而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器将TF卡中的内容读取出来。 1.4.2 代码
适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时可以创建一个抽象类Adapter 实现所有方法。而此时我们只需要继承该抽象类即可。
/*** 适配者类的接口*/
public interface TFCard {// 从TF卡中读取数据String readTF();// 往TF卡中写数据void writeTF(String msg);
}/*** 适配者类*/
public class TFCardImpl implements TFCard {public String readTF() {String msg TFCard read msg I am TFcard;return msg;}public void writeTF(String msg) {System.out.println(TFCard write msg : msg);}
}/*** 目标接口*/
public interface SDCard {// 从SD卡中读取数据String readSD();// 往SD卡中写数据void writeSD(String msg);
}/*** 具体的SD卡*/
public class SDCardImpl implements SDCard {public String readSD() {String msg SDCard read msg I am SD;return msg;}public void writeSD(String msg) {System.out.println(SDCard write msg msg);}
}/*** 适配器类*/
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);}
}/*** 电脑类读取SD卡*/
public class Computer {// 从SD卡中读取数据public String readSD(SDCard sdCard) {if(sdCard null) {throw new NullPointerException(读卡错误请检查SD卡是否插入);}return sdCard.readSD();}
}/*** 客户Client*/
public class Client {public static void main(String[] args) {// 创建电脑对象Computer computer new Computer();// 未定义适配器类电脑只能读取SD卡中的数据String msg computer.readSD(new SDCardImpl());System.out.println(msg);// 创建适配器类对象使用该电脑读取TF卡中的数据SDAdapterTF sdAdapterTF new SDAdapterTF(new TFCardImpl());String msg1 computer.readSD(sdAdapterTF);System.out.println(msg1);}
}// 输出结果
// SDCard read msg I am SD
// adapter read tf card...
// TFCard read msg I am TFcard1.5 应用场景
以前开发的系统存在满足新系统功能需求的类但其接口同新系统的接口不一致。使用第三方提供的组件但组件接口定义和自己要求的接口定义不同。
1.6 JDK源码解析
Reader字符流、InputStream字节流的适配使用的是InputStreamReader。
1.6.1 字节流到字符流的转换类图
InputStreamReader是对同样实现了Reader的StreamDecoder的封装。StreamDecoder不是Java SE API中的内容是Sun JDK给出的自身实现。但我们知道他们对构造方法中的字节流类InputStream进行封装并通过该类进行了字节流和字符流之间的解码转换。 1.6.2 部分源码分析
InputStreamReader继承自java.io包中的Reader对他中的抽象的未实现的方法给出实现。sdStreamDecoder类对象在Sun的JDK实现中实际的方法实现是对sun.nio.cs.StreamDecoder类的同名方法的调用封装。
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);
}1.6.3 总结
从表层来看InputStreamReader做了InputStream字节流类到Reader字符流之间的转换。而从如上Sun JDK中的实现类关系结构中可以看出是StreamDecoder的设计实现在实际上采用了适配器模式。
记录每一个学习瞬间