go语言设计模式之适配器模式

码墨 2019-03-12

本文主要说一下设计模式之适配器模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,csdn:Go语言之美。更多go语言知识信息等)。

github(go语言算法、设计模式等持续更新):

https://github.com/rayyyes

go语言设计模式之适配器模式

适配器模式:将一个类的接口转换成为客户希望的另一个接口,Adapter 模式使得原本由于接口不兼容而不能一起工作的类可以一起工作(大话设计模式里面的,很好的一本书)。

普通话说就是,有一些类的接口是不通用的,但是还需要一起工作,就可以使用这个模式,作为中间的一个适配者。其实在项目中,不止这种情况可以用,有时候为了分层,我们也可以在中间加上这一层,将原来的业务通过适配层分成不同的两部分。

go语言设计模式之适配器模式

我们这里说一个经典的例子,篮球翻译,加入一个篮球队都是外国人,他们都使用英语交流,那么如果队里新来了一个中国人,而且中国人不会英语,这样他们就没有办法一起配合进攻防守,这时就需要一个翻译,这就是一个典型的适配器模式。我们先看代码实现:

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语言哪些方面的内容可以私信作者。

相关推荐