码墨 2019-03-12
本文主要说一下设计模式之适配器模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,csdn:Go语言之美。更多go语言知识信息等)。
github(go语言算法、设计模式等持续更新):
https://github.com/rayyyes
适配器模式:将一个类的接口转换成为客户希望的另一个接口,Adapter 模式使得原本由于接口不兼容而不能一起工作的类可以一起工作(大话设计模式里面的,很好的一本书)。
普通话说就是,有一些类的接口是不通用的,但是还需要一起工作,就可以使用这个模式,作为中间的一个适配者。其实在项目中,不止这种情况可以用,有时候为了分层,我们也可以在中间加上这一层,将原来的业务通过适配层分成不同的两部分。
我们这里说一个经典的例子,篮球翻译,加入一个篮球队都是外国人,他们都使用英语交流,那么如果队里新来了一个中国人,而且中国人不会英语,这样他们就没有办法一起配合进攻防守,这时就需要一个翻译,这就是一个典型的适配器模式。我们先看代码实现:
package main import "fmt" type Player interface { Attack() // 进攻方法 Defense() // 防守方法 } // 前锋 type Forwards struct { Name string } func (this *Forwards) Attack() { fmt.Println("前锋", this.Name, "正在进攻") } func (this *Forwards) Defense() { fmt.Println("前锋", this.Name, "正在防守") } // 中锋 type Center struct { Name string } func (this *Center) Attack() { fmt.Println("中锋", this.Name, "正在进攻") } func (this *Center) Defense() { fmt.Println("中锋", this.Name, "正在防守") } // 后卫 type Guards struct { Name string } func (this *Guards) Attack() { fmt.Println("后卫", this.Name, "正在进攻") } func (this *Guards) Defense() { fmt.Println("后卫", this.Name, "正在防守") } // 外籍中锋(不会英语的外籍中锋) type ForeignCenter struct { Name string } // 外籍中锋进攻方法(认识汉语拼音) func (this *ForeignCenter) jinGong() { fmt.Println("外籍中锋", this.Name, "正在进攻") } // 外籍中锋防守方法(认识汉语拼音) func (this *ForeignCenter) fangShou() { fmt.Println("外籍中锋", this.Name, "正在防守") } type Translator struct { ForeignCenter ForeignCenter } func (this *Translator) Attack() { this.ForeignCenter.jinGong() } func (this *Translator) Defense() { this.ForeignCenter.fangShou() } func main() { var b Player = &Forwards{Name: "巴蒂尔"} b.Attack() var m Player = &Guards{Name: "麦克格雷迪"} m.Defense() // 假设姚明不会英语,就需要一个翻译,翻译告诉姚明进攻或者防守 var ym Player = &Translator{ForeignCenter{Name: "姚明"}} ym.Attack() ym.Defense() }
队里面来了姚明,我们假设他不会英语,不认识Attack和Defense,那么他就不知道如何配合队友,不知道何时进攻防守。所以我们请来了一个翻译Translator,将Attack翻译成进攻,Defense翻译成防守,然后告诉姚明,这样就可以一起配合了。
大家也许会问,姚明自己翻译多好,就不需要翻译了,事实上是可以的,但是这不是适配器模式,适配器模式主要是不改变原有的接口,假如姚明又去了一个说法语的队呢,姚明就需要自己翻译法语,这样就再修改姚明的结构体和方法。适配器主要是保持了原有的接口,同时让不同的接口可以共同使用,这是核心。
更多内容持续更新中,想看go语言哪些方面的内容可以私信作者。