前言:这是我第一篇笔记,没有什么经验,如果哪里有问题希望可以告诉我,我会积极改正。不说废话,下面进入正题。
开始啦
适配器模式
1、首先说一下什么是适配器模式
适配器就是一个桥梁,去连接两个不兼容的接口。举个例子,电脑和内存卡是两个独立的东西,两者之间是不兼容的,读卡器就是内存卡和笔记本之间的桥梁,使用读卡器就可以通过笔记本来读取内存卡,读卡器就是一个适配器。
2、项目中应用场景
系统需要使用其他一些现有的类,而这些类的接口不符合系统的要求
3、应用实例
在LINUX 上运行 WINDOWS 程序,美国电器110V,中国 220V,就要有一个适配器将 110V 转化为 220V等等。
4、优缺点
优点:1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点:1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
5、实现例子
比如现在有个MP3播放器,它只能播放MP3格式的音频,但是感觉不满足我的需求,我还想用这个播放器播放WAV和WAM格式的音频(有点不按常理),这个时候该怎么办呢?
准备:
MP3Player---MP3播放器目前只能播放MP3格式,最终要实现的就是让它播放WAV和WMA格式的音频
WavPlayer---WAV播放器只能播放WAV格式
WmaPlayer---WMA播放器只能播放WMA格式
IMediaPlayer---这三个播放器的父接口,他有一个这三个播放器共有的功能---播放功能
ISeniorPlayer---这个是WavPlayer和WmaPlayer的父接口,这个接口的作用通俗的说,因为MP3播放器想要播放WAV和WMA格式的音频,需要有一个接口去将两个类的方法归到一起,利用多态,实例化的时候方便很多,下面会有代码说明
重点来了PlayerAdapter---这个就是适配器,MP3要想播放其他格式的音频就需要这个适配器
准备工作结束现在开始实现适配器
1、首先在三个播放器父接口IMediaPlayer 添加播放的功能
public interface IMediaPlayer {
public void play(String platform);
}
2、在WavPlayer和WmaPlayer的父接口ISeniorPlayer上面添加播放WAV格式和WMA格式的功能
public interface ISeniorPlayer {
public void playWma(String platform);
public void playWav(String platform);
}
3、之后在WmaPlayer和WavPlayer添加各自播放功能
WmaPlayer:public class WmaPlayer implements ISeniorPlayer{
@Override
public void playWma(String platform) {
System.out.println("***播放WMA格式音频***");
}
@Override
public void playWav(String platform) {
//这个不用处理,因为得重写父接口的方法
}
}
WavPlayer:public class WavPlayer implements ISeniorPlayer {
@Override
public void playWma(String platform) {
//这个不用处理,因为得重写父接口的方法
}
@Override
public void playWav(String platform) {
System.out.println("***播放WAV格式音频***");
}
}
4、因为MP3Player要实现播放多种格式的音频,所以它放到最后处理,先来处理适配器PlayerAdapter
public class PlayerAdapter implements IMediaPlayer{
public ISeniorPlayer seniorPlayer;
public PlayerAdapter(String platform) {
//可以根据不同的参数实例化不同的对象,避免实例化不需要的对象占用内存
if("wav".equalsIgnoreCase(platform)) {
//利用多态实例化对象
seniorPlayer = new WavPlayer();
}else if("wma".equalsIgnoreCase(platform)) {
//利用多态实例化对象
seniorPlayer = new WmaPlayer();
}
}
@Override
public void play(String platform) {
if("wav".equalsIgnoreCase(platform)) {
seniorPlayer.playWav(platform);
}else if("wma".equalsIgnoreCase(platform)) {
seniorPlayer.playWma(platform);
}
}
}
解释一下上面代码,前面的有参构造就是利用了多态巧妙的实例化对象,如果传进来的参数是WAM就是实例化WmaPlayer如果是WAV就实例化WavPlayer,不会再实例化不需要的对象了
后面重写的play()方法就是根据传进的参数不同,调用不同的播放器,整体来说,这个适配器现在有播放WAM和WAV音频的功能,现在只要在MP3Player中处理这个适配器,MP3就可以实现播放WAM和WAV音频的功能了,下面来看看MP3Player是怎么处理的。
5、MP3Player
public class Mp3Player implements IMediaPlayer {
public PlayerAdapter playerAdapter;
@Override
public void play(String platform) {
if("mp3".equalsIgnoreCase(platform)) {
System.out.println("***播放MP3***");
}else if("wav".equalsIgnoreCase(platform)||"wma".equalsIgnoreCase(platform)) {
//实例化PlayerAdapter适配器对象之后会在PlayerAdapter中根据传进来的参数实例化不同的对象(WavPlayer或者WmaPlayer)
playerAdapter = new PlayerAdapter(platform);
playerAdapter.play(platform);
}
}
}
很简单,就是实例化适配器的对象,之后对象调用构造器的方法。
目前为止一个简单的适配器模式实现的MP3播放WAV和WAM格式的音频觉得功能就完成了,现在测试一下吧
public class Test {
public static void main(String[] args) {
Mp3Player mp3Player = new Mp3Player();
mp3Player.play("mp3");
mp3Player.play("wav");
mp3Player.play("wma");
}
}
结果:***播放MP3***
***播放WAV格式音频***
***播放WMA格式音频***