本文共 3926 字,大约阅读时间需要 13 分钟。
适配器模式是一种常见的设计模式,其核心目标是通过转换器(适配器)来解决系统组件接口不兼容的问题。以下将详细探讨适配器模式的定义、实现方式以及实际应用场景。
适配器模式的本质是通过引入转换器(适配器),将现有系统中的组件与新系统的需求接口进行适配。以生活中的例子来看,欧洲插座与我们常用的插头接口不一致,因此需要使用插座转换器来实现充电功能。这种场景在电子产品充电、读卡器、网络设备适配等领域屡见不鲜。
适配器模式的核心作用是将一个类的接口转换为客户期望的另一个接口,从而使原本因接口不兼容而无法协同工作的组件能够正常运作。适配器模式主要分为两种实现方式:类适配器模式和对象适配器模式。
假设我们有一台支持SD卡的计算机,但需要读取TF卡中的数据。SD卡和TF卡的接口不一致,因此需要使用适配器来实现兼容。
// 目标接口public interface SDCard { String readSD(); void writeSD(String msg);}// 具体实现类public class SDCardImpl implements SDCard { public String readSD() { return "SD卡读取示例"; } public void writeSD(String msg) { System.out.println("通过SD卡写入:" + msg); }}// 适配器类public class SDAdapterTF extends TFCardImpl implements SDCard { public String readSD() { System.out.println("适配器读取TF卡"); return readTF(); } public void writeSD(String msg) { System.out.println("适配器写入TF卡"); writeTF(msg); }}// 测试类public class Client { public static void main(String[] args) { Computer computer = new Computer(); // 读取SD卡 String sdMsg = computer.readSD(new SDCardImpl()); System.out.println(sdMsg); System.out.println("--------------"); // 读取TF卡 TFCard tfCard = new TFCardImpl(); SDAdapterTF adapter = new SDAdapterTF(tfCard); String tfMsg = computer.readSD(adapter); System.out.println(tfMsg); }} SD卡读取示例--------------适配器读取TF卡TF卡读取示例
使用对象适配器模式,我们可以通过聚合适配者类来实现适配,同时避免直接继承现有组件库中的类,从而符合合成复用原则。
// 适配器类public class SDAdapterTF implements SDCard { private TFCard tfCard; public SDAdapterTF(TFCard tfCard) { this.tfCard = tfCard; } public String readSD() { System.out.println("适配器读取TF卡"); return tfCard.readTF(); } public void writeSD(String msg) { System.out.println("适配器写入TF卡"); tfCard.writeTF(msg); }}// 测试类public class Client { public static void main(String[] args) { Computer computer = new Computer(); // 读取SD卡 SDCard sdCard = new SDCardImpl(); String sdMsg = computer.readSD(sdCard); System.out.println(sdMsg); System.out.println("--------------"); // 读取TF卡 TFCard tfCard = new TFCardImpl(); SDAdapterTF adapter = new SDAdapterTF(tfCard); String tfMsg = computer.readSD(adapter); System.out.println(tfMsg); }} SD卡读取示例--------------适配器读取TF卡TF卡读取示例
InputStreamReader 是Java中的字符流读取类,其内部通过InputStream(字节流)和StreamDecoder(自定义解码器)实现适配器模式。
Reader├── InputStreamReader│ └── StreamDecoder│ └── InputStream
public class InputStreamReader extends Reader { private InputMismatchException EOFException; private StreamDecoder sd; public InputStreamReader(InputStreamReader reader) throws IOException { this.sd = reader; } // 重写Reader方法,通过sd实现字符读取 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); }} 适配器模式通过引入转换器,解决了现有组件与新系统接口不兼容的问题。两种实现方式(类适配器和对象适配器)各有优缺点,选择时需根据具体需求决定。无论是生活中的插座转换器,还是技术中的InputStreamReader类,都体现了适配器模式的核心价值。
转载地址:http://azhfk.baihongyu.com/