设计模式——适配器模式(Adapter Pattern)+ Spring相关源码

文章目录

  • 一、适配器模式定义
  • 二、例子
    • 2.1 菜鸟教程例子
      • 2.1.1 定义两个不兼容的播放接口MediaPlayer 、AdvancedMediaPlayer
      • 2.1.2 定义AdvancedMediaPlayer两个实现类VlcPlayer 、Mp4Player
      • 2.1.3 定义适配器MediaAdapter
      • 2.1.4 定义AudioPlayer 并使用MediaAdapter
      • 2.1.5 使用
    • 2.2 JDK源码——InputStreamReader
    • 2.3 Spring源码——AdvisorAdapter
  • 三、其他设计模式

一、适配器模式定义

别名: 门面模式
类型: 结构型模式
目的: 将不兼容的接口 通过适配器 转换成可兼容的接口。

二、例子

2.1 菜鸟教程例子

2.1.1 定义两个不兼容的播放接口MediaPlayer 、AdvancedMediaPlayer

public interface MediaPlayer {public void play(String audioType, String fileName);
}
public interface AdvancedMediaPlayer { public void playVlc(String fileName);public void playMp4(String fileName);
}

2.1.2 定义AdvancedMediaPlayer两个实现类VlcPlayer 、Mp4Player

VlcPlayer

public class VlcPlayer implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: "+ fileName);      }@Overridepublic void playMp4(String fileName) {//什么也不做}
}

Mp4Player

public class Mp4Player implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) { //什么也不做 }@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: "+ fileName);      }
}

2.1.3 定义适配器MediaAdapter

将AdvancedMediaPlayer 接口适配MediaPlayer 接口

public class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("vlc") ){advancedMusicPlayer = new VlcPlayer();       } else if (audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer = new Mp4Player();}  }@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}

2.1.4 定义AudioPlayer 并使用MediaAdapter

public class AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter; @Overridepublic void play(String audioType, String fileName) {    //播放 mp3 音乐文件的内置支持if(audioType.equalsIgnoreCase("mp3")){System.out.println("Playing mp3 file. Name: "+ fileName);         } //mediaAdapter 提供了播放其他文件格式的支持else if(audioType.equalsIgnoreCase("vlc")|| audioType.equalsIgnoreCase("mp4")){mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);}else{System.out.println("Invalid media. "+  audioType + " format not supported");}}   
}

2.1.5 使用

public class AdapterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "beyond the horizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}

2.2 JDK源码——InputStreamReader

InputStream接口适配Reader接口

public abstract class Reader implements Readable, Closeable {public int read(CharBuffer target) throws IOException {if (target.isReadOnly())throw new ReadOnlyBufferException();int nread;if (target.hasArray()) {char[] cbuf = target.array();int pos = target.position();int rem = Math.max(target.limit() - pos, 0);int off = target.arrayOffset() + pos;nread = this.read(cbuf, off, rem);if (nread > 0)target.position(pos + nread);} else {int len = target.remaining();char[] cbuf = new char[len];nread = read(cbuf, 0, len);if (nread > 0)target.put(cbuf, 0, nread);}return nread;}}
public class InputStreamReader extends Reader {private final StreamDecoder sd;public InputStreamReader(InputStream in) {super(in);Charset cs = Charset.defaultCharset();sd = StreamDecoder.forInputStreamReader(in, lockFor(this), cs);}public int read(CharBuffer target) throws IOException {return sd.read(target);}
}

2.3 Spring源码——AdvisorAdapter

切面适配器接口。

Advisor适配MethodInterceptor 接口

public interface AdvisorAdapter {boolean supportsAdvice(Advice advice);MethodInterceptor getInterceptor(Advisor advisor);
}

实现类MethodBeforeAdviceAdapter

class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {MethodBeforeAdviceAdapter() {}public boolean supportsAdvice(Advice advice) {return advice instanceof MethodBeforeAdvice;}public MethodInterceptor getInterceptor(Advisor advisor) {MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();return new MethodBeforeAdviceInterceptor(advice);}
}

三、其他设计模式

创建型模式
结构型模式

  • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

行为型模式

  • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
  • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
  • 3、设计模式——策略模式(Strategy Pattern)+ Spring相关源码
  • 4、设计模式——状态模式(State Pattern)
  • 5、设计模式——命令模式(Command Pattern)+ Spring相关源码
  • 6、设计模式——观察者模式(Observer Pattern)+ Spring相关源码
  • 7、设计模式——备忘录模式(Memento Pattern)
  • 8、设计模式——模板方法模式(Template Pattern)+ Spring相关源码
  • 9、设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码
  • 10、设计模式——责任链模式(Chain of Responsibility Pattern)+ Spring相关源码
  • 11、设计模式——解释器模式(Interpreter Pattern)+ Spring相关源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python异常处理:三种不同方法的探索与最佳实践

Python异常处理:三种不同方法的探索与最佳实践 前言 本文旨在探讨Python中三种不同的异常处理方法。通过深入理解各种异常处理策略,我们可以更好地应对不同的编程场景,选择最适合自己需求的方法。 异常处理在编程中扮演着至关重要的角色。合…

Win10共享打印机,别人连接不上出现无法连接到打印机错误码0x0000011b

环境: Win10 专业版 惠普L1119 问题描述: Win10共享打印机,别人连接不上出现无法连接到打印机错误码0x0000011b 解决方案: 1.打开我这台电脑的注册表找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print在右侧…

JVM之类加载器

文章目录 版权声明类加载器类加载器的分类启动类加载器拓展类加载器&应用程序类加载器 双亲委派机制解决三个问题 打破双亲委派机制自定义类加载器案例演示线程上下文类加载器案例梳理OSGi模块化 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我…

http客户端简单demo

socket.h头文件 #pragma once #include <iostream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string> using std::string;namespace MySocket …

KVM虚拟机迁移原理与实践

虚拟机迁移 迁移(migration)包括系统整体的迁移和某个工作负载的迁移&#xff0c;系统整体迁移是将系统上的所有软件&#xff0c;包括操作系统&#xff0c;完全复制到另一台物理硬件机器上&#xff0c;而工作负载迁移仅仅迁移特定的工作负载。 虚拟化技术的出现&#xff0c;丰…

android源码添加adb host支持

本文开始参考在 android 上使用 adb client-CSDN博客&#xff0c;在shell中已经可以使用。但当我想在app中用 String command "/data/local/tmp/adb -s 307ef90dc8128844 shell ls";StringBuilder output new StringBuilder();try {Process process Runtime.getR…

Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)

前言&#xff1a;在我的上一篇Linux博客我已经讲了基础指令和权限&#xff0c;现在我们来学习如何在Linux上运行和执行代码 目录 一&#xff0c;yum 二&#xff0c;vim 1&#xff09;命令行模式 2&#xff09;插入模式 3&#xff09;底行模式 三&#xff0c;gcc/g 四&a…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分&#xff08;均匀分布&am…

PHP·解决http_build_query模拟浏览器请求多选参数加下标索引的BUG| 无法模拟浏览器多选参数问题

$form_params array(id > 1,ids > [1,2,3], ); $form_params http_build_query($form_params); $form_params preg_replace(/%5B[0-9]%5D/simU, %5B%5D, $form_params);参考 http_build_query — 生成 URL-encode 之后的请求字符串

计算机提示找不到xinput1_3.dll怎么办?6个xinput1_3.dll丢失完美解决方案分享

xinput1_3.dll是Windows操作系统中的一个重要动态链接库文件&#xff0c;它负责处理游戏控制器和其他输入设备的相关功能。当计算机出现xinput1_3.dll缺失的问题时&#xff0c;可能会导致无法正常使用游戏控制器或其他输入设备。下面是针对这个问题的6个解决方法&#xff1a; 方…

基于html+jquery开发的科学计算器(课程作业)

基于html和jquery开发的科学计算器&#xff0c;该科学计算器可进行乘方、开方、指数、对数、三角函数、统计等方面的运算&#xff0c;又称函数计算器。 科学型带有所有普通的函数&#xff0c;所有的函数都分布在键盘上以致于你可以不用通过菜单列表来使用它们。 科学计算器支持…

微服务-我对Spring Clound的理解

官网&#xff1a;https://spring.io/projects/spring-cloud 官方说法&#xff1a;Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

常用布局以及其优缺点

当涉及到设计和排版时&#xff0c;有许多不同的布局方式可供选择。以下是几种常见的布局方式以及它们的优缺点&#xff1a; 流式布局&#xff08;Fluid Layout&#xff09;&#xff1a; 优点&#xff1a;能够根据屏幕大小自动调整内容&#xff0c;适应不同设备。灵活性高&#…

android:scaleType属性

1. matrix : 不改变原图大小&#xff0c;在ImageView左上角开始显示&#xff0c;超出部分剪裁。 2. center : 不改变原图大小&#xff0c;在ImageView中央显示&#xff0c;超出部分剪裁。 3. centerCrop(剪裁) : 原图按等比例缩放&#xff0c;直至填满整个ImageView&#xff…

分布式搜索引擎ES

文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…

微机原理5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 下列数中最小的数是&#xff08;&#xff09; A. (10111) B. (30) C. (100010) BCD D. 17H 2,下面四个寄存器中,不能作为间接寻址的寄存器是() A. BX B. DX C.…

ChatGPT 如何改变科研之路

《Nature》全球博士后调查[1]中约有三分之一的受访者正在使用人工智能聊天机器人来帮助完善文本、生成或编辑代码、整理其领域的文献等等。 来自巴西的 Rafael Bretas 在日本生活了十多年&#xff0c;日语说得很好。书面日语的各个方面&#xff0c;例如严格的礼貌等级制度&…

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接 目录 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接深入理解用户缓冲区缓冲区刷新问题缓冲区存在的意义 File模拟实现C语言中文件标准库 文件系统认识磁盘对目录的理解 软硬链接软硬链接的删除文件的三个时间 作者…

2023.11.11 hive中的内外部表的区别

一.内部表操作 ------------------------------1内部---------------------------- --建库 create database hive2; --用库 use hive2; --删表 drop table t1; --建表 create table if not exists t1(id int,name string,gender string ); --复制内部表 --复制表结构:CREATE T…

计算机视觉中目标检测的数据预处理

本文涵盖了在解决计算机视觉中的目标检测问题时&#xff0c;对图像数据执行的预处理步骤。 首先&#xff0c;让我们从计算机视觉中为目标检测选择正确的数据开始。在选择计算机视觉中的目标检测最佳图像时&#xff0c;您需要选择那些在训练强大且准确的模型方面提供最大价值的图…