为什么要使用适配器设计模式
在编写项目的过程中,很多的时候写好了一个代码量很多的类,突然要增加一个功能,但是在最初的设计项目的时候并没有考虑到了这一点,所以为了提高代码的可扩展和可维护性,我们可以引入Java设计模式中的适配器模式。举个简单的励志,在我们电脑下载好了一些歌曲,我们需要把这些歌曲的文件导入到你的移动音乐播放设备(手机或者mp3),这个时候我们电脑上只有usb接口,而手机或者MP3设备并没有一样的usb接口,这时我们需要一根数据线进行连接,这样我们通过数据线将电脑和音乐播放设备连接起来,就可以进行数据的传输,我们可以把这根数据线看成我们所说的适配器。适配器设计模式可以连接两个不相干的类进行数据的处理。
代码处理
这里我们先来个简单的适配器设计模式来看下所谓的适配器模式是否像你想象的一样高大尚
这里我们应该准备几个类来进行测试
- 两个接口
- 两个实现类
- 一个测试类
- 一个适配器类
首先我们创建一个USB接口和一个MP3接口
USB接口
package net.cncandy.adapter;
public interface USB {
public String showConnectInfo();
}
MP3接口
package net.cncandy.adapter;
public interface MP3 {
public String showMp3Info();
}
每个接口我呢都写一个显示链接信息的方法。好判断我们是否链接上
在创建ComputerUSB类和MusicMp3类,这两个类分别实现USB接口和MP3接口,重写接口的方法。
ComputerUSB类
package net.cncandy.adapter;
public class ComputerUSB implements USB{
private USB usb;
public ComputerUSB(USB usb) {
this.usb = usb;
}
@Override
public String showConnectInfo() {
return usb.showConnectInfo();
}
}
MusicMp3类
package net.cncandy.adapter;
public class MusicMp3 implements MP3{
@Override
public String showMp3Info() {
return "这个MP3设备已经连接";
}
}
接下来我们在没有适配器的情况下先看下讲MP3和USB能否链接
这显然是不可能链接到的,,因为在我们的ComputerUSB类中,构造函数是传递的USB接口,因为MusicMp3类并不是实现的USB接口,所以这里就不能直接传递值,这里就要用到咱们本次要学习的适配器设计模式,通过适配器链接两个不相干的类。
适配器设计模式分析
先向下,既然是要写一个可以连接两个不相干的类,那么首先我们要将适配器的类要实现如上ComputerUSB类所实现的接口,那样我们才能在ComputerUSB的构造器中填入该适配器,所以我们这个适配器类要实现USB的接口,同时需要传入MusicMp3这个类的对象,所以说在适配器类的构造函数里参数应该是MusicMp3类的对象,应为我们的MusicMp3类是实现的MP3接口,我们还要创建一个MP3的属性(这个就是玩的多态),以便于接受传进来的MusicMp3对象。看上面这么多其实可以总结一下几点:
- 适配器类实现USB接口
- 适配器类的构造函数参数是MP3
- 创建一个MP3的属性,接受构造函数传进来的值
接下看下适配器的代码,可以好好的理解下,这些代码里面用到了多态的知识,如果不了解多态的话,可以先看下多态在来看次篇文章
package net.cncandy.adapter;
public class Adapter implements USB{
//用于接收构造方法传进来的MP3类对象
private MP3 MusicMp3;
//构造函数
public Adapter(MP3 mp3) {
this.MusicMp3 = mp3;
}
//重写的USB接口的方法
@Override
public String showConnectInfo() {
return MusicMp3.showMp3Info();
}
}
通过测试类进行测试
public class TestDemo {
public static void main(String[] args) {
MusicMp3 mp3 = new MusicMp3();
ComputerUSB computerUSB = new ComputerUSB(new Adapter(mp3));
System.out.println(computerUSB.showConnectInfo());
}
}
显示的结果,看这样就可以通过适配器链接两个不相干的类了。
适配器设计模式的优缺点
优点:可以提高代码的可扩展和可维护性,更好的代码复用,如果功能相同接口不一样的话,可以通过适配器来进行处理
缺点:过多的适配器会让代码很乱,不容易掌控,在写项目的过程中使用适配器不能太多。