使用go实现适配器模式

目录
  • 适配器模式
    • 定义
    • 代码实现
    • 优点
    • 缺点
    • 适用范围
    • 参考

适配器模式

定义

适配器模式的英文翻译是Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。

举个栗子:

现在比较新款的电脑都有USB-C接口,但是我们目前的鼠标键盘的接口都是传统的USB接口,所以是不能使用的,这时候我们会买个转接口来进行接口的转接,那么这个转接口在设计模式中就是适配器。

代码实现

// 基础的播放功能
type MediaPlayer interface {
	play(audioType string, fileName string)
}

// 不同的播放器平台
type AdvancedMediaPlayer interface {
	playVlc(fileName string)
	playMp4(fileName string)
}

// VlcPlayers
type VlcPlayers struct {
}

func (v *VlcPlayers) playVlc(fileName string) {
	fmt.Println("正在播放" + fileName)
}

func (v *VlcPlayers) playMp4(fileName string) {
	fmt.Println("格式不支持")
}

// Mp4Player
type Mp4Player struct {
}

func (m *Mp4Player) playVlc(fileName string) {
	fmt.Println("格式不支持")
}

func (m *Mp4Player) playMp4(fileName string) {
	fmt.Println("正在播放" + fileName)
}

// 适配器
type MediaAdapter struct {
	MusicPlayer AdvancedMediaPlayer
}

func NewMediaAdapter(audioType string) *MediaAdapter {
	var mediaAdapter MediaAdapter
	switch audioType {
	case "vlc":
		mediaAdapter.MusicPlayer = &VlcPlayers{}
	case "mp4":
		mediaAdapter.MusicPlayer = &Mp4Player{}
	default:
		panic("不支持的类型")
	}
	return &mediaAdapter
}
func (m *MediaAdapter) play(audioType string, fileName string) {
	switch audioType {
	case "vlc":
		m.MusicPlayer.playVlc(fileName)
	case "mp4":
		m.MusicPlayer.playMp4(fileName)

	}
}

// AudioPlayer 音频播放器类
type AudioPlayer struct {
	mediaAdapter *MediaAdapter
}

// Play 播放音频
func (auPlayer *AudioPlayer) Play(audioType, fileName string) {
	if audioType == "mp3" {
		fmt.Println("正在播放" + fileName)
		return
	}
	auPlayer.mediaAdapter = NewMediaAdapter(audioType)
	auPlayer.mediaAdapter.play(audioType, fileName)
}

测试文件

func TestPlayer(t *testing.T) {
	ad := AudioPlayer{}
	ad.Play("mp4", "荷塘月色")
	ad.Play("vlc", "小苹果")
	ad.Play("mp3", "天空之城")
}

这里做个简单的分析

1、我们有一个 AudioPlayer ,但是只能播放 mp3;

2、我们希望 AudioPlayer 也可以播放 mp3 和 vlc;

3、引入了一个 MediaAdapter ,通过适配器来处理不支持的功能,对于 AudioPlayer 来讲,它只用需要调用 MediaAdapter 就能实现各种播放格式音频的播放;

4、MediaAdapter 对各种格式进行了包装,不同的格式音频,可以有用相同的调用方法。

放一张结构图

优点

1、可以让任何两个没有关联的类一起运行。

2、提高了类的复用。

3、增加了类的透明度。

4、灵活性好。

缺点

过多地使用适配器,会让系统非常零乱,不易整体进行把握

一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无奈之举”,如果在设计初期,我们就能协调规避接口不兼容的问题,那这种模式就没有应用的机会了。

如果大量的使用这种模式,可能就是我们的前期的设计有很大的问题,就需要考虑重构了

适用范围

1、封装有缺陷的接口设计

2、统一多个类的接口设计

3、替换依赖的外部系统

4、兼容老版本接口

5、适配不同格式的数据

代理、桥接、装饰器、适配器4种设计模式的区别

代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。

桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。

装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。

适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。

参考

【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/适配器模式
【大话设计模式】https://book.douban.com/subject/2334288/
【极客时间】https://time.geekbang.org/column/intro/100039001
【菜鸟教程】https://www.runoob.com/design-pattern/adapter-pattern.html
【诗适配器模式】https://boilingfrog.github.io/2021/11/14/使用go实现适配器模式/

到此这篇关于使用go实现适配器模式的文章就介绍到这了,更多相关go适配器模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python的Django框架可适配的各种数据库介绍

    在 Django 中使用 PostgreSQL 使用 PostgreSQL 的话,你需要从 http://www.djangoproject.com/r/python-pgsql/ 下载 psycopg 这个开发包. 我们建议使用psycopg2,因为它是新的,开发比较积极,且更容易安装. 留意你所用的是 版本 1 还是 2,稍后你会需要这项信息. 如果在 Windows 平台上使用 PostgreSQL,可以从 http://www.djangoproject.com/r/python-pgs

  • javascript设计模式之Adapter模式【适配器模式】实现方法示例

    本文实例讲述了javascript设计模式之Adapter模式.分享给大家供大家参考,具体如下: 所谓Adapter模式就是适配器模式,主要是指使两个原本没有关联的类结合一起使用. JS实现Adapter模式示例如下: <!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript" src="json.js"&g

  • Ruby设计模式编程之适配器模式实战攻略

    适配器模式 适配器模式可以用于对不同的接口进行包装以及提供统一的接口,或者是让某一个对象看起来像是另一个类型的对象.在静态类型的编程语言里,我们经常使用它去满足类型系统的特点,但是在类似Ruby这样的弱类型编程语言里,我们并不需要这么做.尽管如此,它对于我们来说还是有很多意义的. 当使用第三方类或者库的时候,我们经常从这个例子开始(start out fine): def find_nearest_restaurant(locator) locator.nearest(:restaurant,

  • Java适配器模式_动力节点Java学院整理

    一.概念 适配器模式将一个接口转换成客户希望的另外一个接口.它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作. 二.UML 三.更加生动的例子 四.实例分析 去年买了一个本本,另外给本本配了罗技G1光电套.坑爹的是,光电套的鼠标是USB接口,键盘是PS2接口,可我的本本却没有PS2接口啊.于是跑到市场,淘了一个转接器. 于是乎,我抽象了这么几个类. 1.PS2Port(PS2接口). 2.USBPort(USB接口). 3.PS2ToUSB(对象适配器),将PS2接口装换成USB接口

  • 轻松掌握Java适配器模式

    在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 特点:将两个不兼容的类通过接口实现在一起工作 企业级开发和常用框架中的应用:流接口,例如将字符流转换为字节流输出是用的outputstreamreader 适配器模式分为类适配器和对象适配器: 举例:电脑只有USB接口,但是键盘只有圆口,这时就需要一个适配器,让键盘能输入数据到电脑 类适配器: pac

  • java设计模式笔记之适配器模式

    适配器(Adapter)模式: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 生活中的场景: 1.笔记本电源适配器,可以将220v转化为适合笔记本使用的电压. 2.给笔记本电脑的usb接口插入台式机的ps/2接口的键盘,需要一个usb和ps/2的接口转接器,此时usb和ps/2的接口转接器就充当了适配器的角色. 通用类图: 在上面的通用类图中,Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一

  • iOS App设计模式开发之适配器模式使用的实战演练

    相信做App开发的同学,对于一些第三方的统计分析.错误收集等SDK应该都不陌生.就目前而言市面上也有许多相同功能的产品,眼花缭乱,让人无法抉择选哪一款SDK才是最靠谱的.那就随便先选一款试试用吧! 那么问题来了:如果项目都快做完了结果发现这款SDK实在坑爹,不仅扩展性差,还经常让App Crash,那你是不是会想到替换掉这个SDK? OK,那我们就换另一个试试,下载SDK下来,一看,傻眼了,设计风格,封装模块完全不一样,于是乎我们就到项目中全局搜索找到之前的SDK代码干掉,然后重新再到各种地方用

  • NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】

    本文实例讲述了NodeJS设计模式.分享给大家供大家参考,具体如下: 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实例对象,并将实例对象保存在静态变量中,当下次请求时,则可以直接返回这个对象实例,这就确保了一个类只有一个实例对象.举个例子吧~一间学校刚刚起建还没有图书馆,有的同学就向领导提意见:"hey! 哥们,能不能帮我们建一个图书馆? "(想要一个图书馆实例),然后领导说:"no pro

  • JavaScript适配器模式详解

    适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象. 基本理论 适配器模式:将一个接口转换成客户端需要的接口而不需要去修改客户端代码,使得不兼容的代码可以一起工作. 适配器主要有3个角色组成: (1)客户端:调用接口的类 (2)适配器:用来连接客户端接口和提供服务的接口的类 (3)适配者:提供服务,但是却与客户端接口需求不兼容服务类. 此处 有一个实例是关于两个数的加法的. 一.先有一个能够实现,两个数加法的

  • Adapter适配器模式在JavaScript设计模式编程中的运用分析

    定义 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作.速成包装器(wrapper). 适配器的别名是包装器(wrapper),这是一个相对简单的模式.在程序开发中有许多这样的场景:当我们试图调用模块或者对象的某个接口时,却发现这个接口的格式并不符合目前的需求.这时候有两种解决办法,第一种是修改原来的接口实现,但如果原来的模块很复杂,或者我们拿到的模块是一段别人

  • 详解JavaScript实现设计模式中的适配器模式的方法

    有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器,我们可以在不用修改旧代码的情况下也能使用它们,这就是适配器的能力. 适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象. 从表面上看,适配器模式很像外观模式.它们都要对别的对象进行包装并改变其呈现的接口.二者的差

随机推荐