开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第七天,点击查看活动详情
PS:已经更文多少天,N就写几。一定要写对文案,否则文章不计入在内;模板句子需要带超链接。
今天我们来看一下适配器模式。
适配器(Adapter Pattern) 可以将两个不兼容的接口的功能连起来。适配器就是两个不兼容的接口之间的桥梁。也属于结构型模式。
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
现在我们有两个播放器接口的实现类,一个是MP3播放器,一个是MP4播放器:
package com.xing.design.adapter;
/** * 媒体播放器接口 * @author xing * @createTime */public interface MediaPlayer {
/** * 播放 * @param audioType 类型 * @param fileName 文件名 */public void play(String audioType, String fileName);}
MP3:
package com.xing.design.adapter;
/** * 适配器 * @author xing * @createTime */public class MediaAdapter implements MediaPlayer{
/** * MP4播放器 */ Mp4Player mp4Player;
public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("mp4")){ mp4Player = new Mp4Player(); }else { System.out.println("只可适配MP4格式,如需扩展,在此处引入。"); } }
@Overridepublic void play(String audioType, String fileName) { mp4Player.play(audioType, fileName); }}
我们在适配器中引入了Mp4Player,如果需要适配多个类型,在这里引入即可。
接下来,我们把适配器引入Mp3Player:
package com.xing.design.adapter;
public class AdapterPatternDemo {
public static void main(String[] args) {
// MP3播放 Mp4Player mp4 = new Mp4Player(); System.out.println("用mp4播放器播放:"); mp4.play("mp3","2.MP3"); mp4.play("mp4","2.MP4");
Mp3Player player = new Mp3Player(); System.out.println("通过适配器用mp3播放器播放不同类型:"); player.play("mp3", "3.mp3"); player.play("mp4", "4.mp4"); player.play("vlc", "v.vlc"); }}
使用场景:
首先我们来看下使用场景,当客户在接口中定义了他期望的行为时,我们提供一个实现该接口的类,并且扩展已有的类并且通过创建子类来实现适配,用白话文也就是说:我们建立一个听歌的接口,建立两个个实现该接口的mp3类和mp4类,如果只是分别调用mp3类和mp4类的话,我们始终只能听一种格式的歌曲,此时就可以通过扩展类,整一个适配器的类,使适配器类含有扩展类(注意适配器调用被包裹对象的物理实体),就可以播放多种格式的歌曲了。系统需要使用现有的类,而此类的接口不符合系统的需要。此时就建立一个可以重复使用的类(适配器),引进没有太大关联的类(要用的类),使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
总结:
适配器一般不是在初始详细设计时添加的,而是为了解决正在生产上的项目的问题,不方便更改代码,怕引起未知的故障。所以搞一个适配器类,把不关联的接口全部引入到这个类中,这样只要使用这个适配器类就可以啦。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。也就是适配器容纳一个它包裹的类的实例。这种适配器模式下,用适配器去继承自已已经实现的类(一般多重继承),也可以实现目的。
END
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第七天,点击查看活动详情
PS:已经更文多少天,N就写几。一定要写对文案,否则文章不计入在内;模板句子需要带超链接。