适配器模式
GitHub代码链接
适配器模式(Adapter Pattern)是作为两个不兼容接口之间的桥梁。例如,读卡器是笔记本和内存卡之间的适配器。
什么是适配器模式
适配器模式将一个类的接口转换为另一个类的接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
解决了什么问题
主要解决在软件系统中,常常需要将一些现存的对象放到新的环境中,而新环境要求的接口是现有对象不满足的。
优点
- 可以让两个没有关联的类一起运行。
- 提高了类的复用
- 灵活性好
缺点
- 过多的适配器会让系统凌乱,明明调用的是A接口,进去发现实际调用的是B接口,这使得代码维护变得复杂。
代码实现
实现思路
- Mediaplayer播放器接口
- media视频播放器接口继承 AdvanceMediaPlayer
- audio音频播放器接口继承 MediaPlayer
- adapterMedia适配器继承 MediaPlayer
- 实例化MediaPlayer,这时mediaPlayer只能播放音频,media视频播放器的接口是AdvanceMediaPlayer,不能直接调用,所以使用adapterMedia适配器来间接调用media视频播放器。
1.1 接口实现
//MediaPlayer 多媒体播放器接口
type MediaPlayer interface {
Play(audioType, fileName string)
}
//AdvanceMediaPlayer 新多媒体播放器接口
type AdvanceMediaPlayer interface {
PlayRmvb(fileName string)
PlayMP4(fileName string)
}
1.2 AdvanceMediaPlayer高级播放器类实现
//RmvbPlayer rmvb播放器类
type RmvbPlayer struct{}
//NewRmvbPlayer 实例化rmvb播放器类
func NewRmvbPlayer() *RmvbPlayer {
return &RmvbPlayer{}
}
//PlayRmvb 播放rmvb格式视频方法
func (rmvb *RmvbPlayer) PlayRmvb(fileName string) {
fmt.Println("Playing rmvb file. Name: ", fileName)
}
//PlayMP4 为了实现接口所写,不使用这个方法
func (rmvb *RmvbPlayer) PlayMP4(fileName string) {
//do nothing
}
1.3 适配器类
//MediaAdapter 多媒体播放器适配器
type MediaAdapter struct {
MusicPlayer AdvanceMediaPlayer
}
//NewMediaAdapter 初始化适配器
func NewMediaAdapter(audioType string) *MediaAdapter {
switch audioType {
case "rmvb":
return &MediaAdapter{MusicPlayer: NewRmvbPlayer()}
case "mp4":
return &MediaAdapter{MusicPlayer: NewMp4Player()}
}
return nil
}
//Play 根据文件类型,调用相应的适配器进行播放
func (mAdapter *MediaAdapter) Play(audioType, fileName string) {
switch audioType {
case "rmvb":
mAdapter.MusicPlayer.PlayRmvb(fileName)
break
case "mp4":
mAdapter.MusicPlayer.PlayMP4(fileName)
break
}
}
1.4 音频播放器类实现
//AudioPlayer 音频播放器类
type AudioPlayer struct {
mediaAdapter *MediaAdapter
}
//NewAudioPlayer 音频播放器实例化
func NewAudioPlayer() *AudioPlayer {
return &AudioPlayer{}
}
//Play 播放音频
func (auPlayer *AudioPlayer) Play(audioType, fileName string) {
if audioType == "mp3" {
fmt.Println("Playing mp3 file. Name: ", fileName)
} else if audioType == "rmvb" || audioType == "mp4" {
auPlayer.mediaAdapter = NewMediaAdapter(audioType)
if auPlayer.mediaAdapter == nil {
fmt.Println("mediaAdapter create fail.")
}
auPlayer.mediaAdapter.Play(audioType, fileName)
} else {
fmt.Println("Invalid media type. ", audioType, "format not supported")
}
}