6.Golang设计模式之适配器模式

适配器模式

GitHub代码链接
适配器模式(Adapter Pattern)是作为两个不兼容接口之间的桥梁。例如,读卡器是笔记本和内存卡之间的适配器。

什么是适配器模式

适配器模式将一个类的接口转换为另一个类的接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

解决了什么问题

主要解决在软件系统中,常常需要将一些现存的对象放到新的环境中,而新环境要求的接口是现有对象不满足的。

优点

  • 可以让两个没有关联的类一起运行。
  • 提高了类的复用
  • 灵活性好

缺点

  • 过多的适配器会让系统凌乱,明明调用的是A接口,进去发现实际调用的是B接口,这使得代码维护变得复杂。

代码实现

实现思路

  1. Mediaplayer播放器接口
  2. media视频播放器接口继承 AdvanceMediaPlayer
  3. audio音频播放器接口继承 MediaPlayer
  4. adapterMedia适配器继承 MediaPlayer
  5. 实例化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")
    }
}

上一篇

5.Golang设计模式之原型模式

下一篇

7.Golang设计模式之桥接模式

你可能感兴趣的:(6.Golang设计模式之适配器模式)