当前位置: 首页 > news >正文

结构型模式 - 适配器模式 (Adapter Pattern)

结构型模式 - 适配器模式 (Adapter Pattern)

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


  • 类适配器,适用于要适配的类是一个接口,定义了规范。然后配合 extend 和 implements
public class SDAdapterTF extends TFCardImpl implements SDCard {
	// 实现 SDCard 的标准方法,读取 sd方法
	public String readSD() {
		// 适配 readTF 来当成 readSD 使用,达到适配的效果
		return readTF();
	}
}
  • 对象适配器,适用于要适配的是类,因为Java 不支持多继承 extends , 不采用 extends 就不会把宝贵的继承位占掉.
public class SDAdapterTF implements SDCard {
	private TFCard tfCard;

	public SDAdapterTF(TFCard tfCard) {
		this.tfCard = tfCard; // 由构造函数传递对象进来
	}

	public String readSD() {
		// 利用成员对象的方式来调用,就不会占用 extends
		return tfCard.readTF();
	}
}

  • 接口适配器

这个也经常用, 当你只想要实现部分功能, 这么做就不需要全部实现

// 定义媒体播放器接口,包含多种播放方法
interface MediaPlayer {
    void playMP3(String fileName);
    void playMP4(String fileName);
    void playAVI(String fileName);
}

// 接口适配器抽象类,实现 MediaPlayer 接口并提供默认空实现
abstract class MediaPlayerAdapter implements MediaPlayer {
    @Override
    public void playMP3(String fileName) {
        // 默认空实现
    }

    @Override
    public void playMP4(String fileName) {
        // 默认空实现
    }

    @Override
    public void playAVI(String fileName) {
        // 默认空实现
    }
}

// 具体的 MP3 播放器类,继承自 MediaPlayerAdapter 并重写 playMP3 方法
class MP3Player extends MediaPlayerAdapter {
    @Override
    public void playMP3(String fileName) {
        System.out.println("Playing MP3 file: " + fileName);
    }
}

// 具体的 MP4 播放器类,继承自 MediaPlayerAdapter 并重写 playMP4 方法
class MP4Player extends MediaPlayerAdapter {
    @Override
    public void playMP4(String fileName) {
        System.out.println("Playing MP4 file: " + fileName);
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建 MP3 播放器对象
        MediaPlayer mp3Player = new MP3Player();
        mp3Player.playMP3("song.mp3");

        // 创建 MP4 播放器对象
        MediaPlayer mp4Player = new MP4Player();
        mp4Player.playMP4("movie.mp4");
    }
}

相关文章:

  • 图像处理案例06 OCR应用
  • C++基础入门——Vetor与函数
  • 华为机试牛客刷题之HJ11 数字颠倒
  • KylinSP3 | 防火墙和麒麟安全增强设置KySec
  • 【电机控制器】ESP32-C3语言模型——通义千问
  • 数据库 安装initializing database不通过
  • 货车一键启动无钥匙进入手机远程启动的正确使用方法
  • 【SpringBoot】——分组校验、自定义注解、登入验证(集成redis)、属性配置方式、多环境开发系统学习知识
  • python zipfile
  • 在spring项目中,引入mybatis
  • PCB设计常用布局布线方法
  • 错误 MSB3073 命令“setlocal“
  • Vue中环境配置的若干问题解决
  • 蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)
  • HTML解析 → DOM树 CSS解析 → CSSOM → 合并 → 渲染树 → 布局 → 绘制 → 合成 → 屏幕显示
  • Redis存储​⑫​哨兵Sentinel_高可用实现方案
  • [C]基础10.深入理解指针(2)
  • 数据结构--排序
  • 一个std::async的示例
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现
  • 保健品网站可以做网站/seo排名关键词搜索结果
  • 基金网站建设/最好的bt种子搜索引擎
  • 小型b2c网站建设费用/推广公司主要做什么
  • 只做水果的网站/百度关键词排名推广工具
  • wordpress 手机端异常/深圳网络推广优化
  • 做网站在哪/上海网络推广需要多少