博客
关于我
设计模式_结构型模式 -《适配器模式》
阅读量:796 次
发布时间:2023-03-25

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

适配器模式(Adapter Pattern)解析

适配器模式是一种常见的设计模式,其核心目标是通过转换器(适配器)来解决系统组件接口不兼容的问题。以下将详细探讨适配器模式的定义、实现方式以及实际应用场景。


概述

适配器模式的本质是通过引入转换器(适配器),将现有系统中的组件与新系统的需求接口进行适配。以生活中的例子来看,欧洲插座与我们常用的插头接口不一致,因此需要使用插座转换器来实现充电功能。这种场景在电子产品充电、读卡器、网络设备适配等领域屡见不鲜。


定义

适配器模式的核心作用是将一个类的接口转换为客户期望的另一个接口,从而使原本因接口不兼容而无法协同工作的组件能够正常运作。适配器模式主要分为两种实现方式:类适配器模式对象适配器模式

  • 类适配器模式:通过继承适配者类并实现目标接口来实现适配。
  • 对象适配器模式:通过聚合适配者类并实现目标接口来实现适配,符合合成复用原则。

适配器模式的主要角色

  • 目标接口(Target Interface):当前系统所期望的接口规范,可能是抽象类或具体接口。
  • 适配者(Adaptee):需要被适配的现有组件库中的组件接口。
  • 适配器(Adapter):转换器类,通过继承或聚合适配者类,将其接口转换为目标接口。

  • 类适配器模式示例

    场景描述

    假设我们有一台支持SD卡的计算机,但需要读取TF卡中的数据。SD卡和TF卡的接口不一致,因此需要使用适配器来实现兼容。

    类图说明

    • 目标接口(SDCard):定义SD卡的读取和写入操作。
    • 适配者接口(TFCard):定义TF卡的读取和写入操作。
    • 适配者类(TFCardImpl):实现TF卡接口。
    • 适配器类(SDAdapterTF):继承TFCardImpl并实现SDCard接口。

    代码实现

    // 目标接口
    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卡读取示例

    适配器模式的应用场景

  • 现有系统与新系统接口不兼容
  • 使用第三方组件,其接口与当前系统不一致
  • 需要对已有组件进行功能扩展或修改时

  • JDK中的InputStreamReader应用

    技术背景

    InputStreamReader 是Java中的字符流读取类,其内部通过InputStream(字节流)和StreamDecoder(自定义解码器)实现适配器模式。

    工作原理

    • Reader:字符流接口。
    • InputStream:字节流接口。
    • InputStreamReader:InputStream的字符流适配器,通过InputStream读取字节并将其转换为字符。

    类结构图

    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作为适配器,将InputStream(适配者)聚合到StreamDecoder(具体实现)。
    • StreamDecoder作为适配器,将字节流转换为字符流,实现了Reader接口。

    总结

    适配器模式通过引入转换器,解决了现有组件与新系统接口不兼容的问题。两种实现方式(类适配器和对象适配器)各有优缺点,选择时需根据具体需求决定。无论是生活中的插座转换器,还是技术中的InputStreamReader类,都体现了适配器模式的核心价值。

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

    你可能感兴趣的文章
    Objective-C实现IIR 滤波器算法(附完整源码)
    查看>>
    Objective-C实现IIR数字滤波器(附完整源码)
    查看>>
    Objective-C实现insertion sort插入排序算法(附完整源码)
    查看>>
    Objective-C实现integer partition整数分区算法(附完整源码)
    查看>>
    Objective-C实现integerPartition整数划分算法(附完整源码)
    查看>>
    Objective-C实现interpolation search插值搜索算法(附完整源码)
    查看>>
    Objective-C实现Interpolation search插值查找算法(附完整源码)
    查看>>
    Objective-C实现intersection交集算法(附完整源码)
    查看>>
    Objective-C实现intro sort内省排序算法(附完整源码)
    查看>>
    Objective-C实现inversions倒置算法(附完整源码)
    查看>>
    Objective-C实现isalpha函数功能(附完整源码)
    查看>>
    Objective-C实现islower函数功能(附完整源码)
    查看>>
    Objective-C实现isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
    查看>>
    Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
    查看>>
    Objective-C实现Julia集算法(附完整源码)
    查看>>
    Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
    查看>>
    Objective-C实现k-Means算法(附完整源码)
    查看>>