golang 适配器模式

102 阅读1分钟

没啥可讲,适配接口,默认接口,不能实现客户的要求,我们就去改。

package main
                                                                                                                                                                                                                                                                                
import (
    "fmt"
)
                                                                                                                                                                                                                                                                                
func main() {
    duck := &MallardDuck{}
    turkey := &WildTurkey{}
    turkeyAdapter := NewTurkeyAdapter(turkey)
                                                                                                                                                                                                                                                                                
    fmt.Println("The Turkey says...")
    turkey.gobble()
    turkey.fly()
                                                                                                                                                                                                                                                                                
    fmt.Println("The Duck says...")
    duck.quack()
    duck.fly()
                                                                                                                                                                                                                                                                                
    fmt.Println("The TurkeyAdapter says...")
    turkeyAdapter.quack()
    turkeyAdapter.fly()
}
                                                                                                                                                                                                                                                                                 
//鸭子Duck接口,具备呱呱叫和飞行的能力
type Duck interface {
    quack() //呱呱叫
    fly()   //飞行
}
                                                                                                                                                                                                                                                                                 
//火鸡Turkey接口
type Turkey interface {
    gobble() //火鸡不会呱呱叫,只会咯咯叫(gobble)
    fly()    //火鸡也会飞,虽然飞不远
}
                                                                                                                                                                                                                                                                                 
//实现了Duck接口
type MallardDuck struct{}
                                                                                                                                                                                                                                                                                 
func (*MallardDuck) quack() {
    fmt.Println("Quack...")
}
                                                                                                                                                                                                                                                                                 
func (*MallardDuck) fly() {
    fmt.Println("I'm flying")
}
//实现了Turkey接口
type WildTurkey struct{}
func (*WildTurkey) gobble() {
    fmt.Println("Gobble...")
}
                                                                                                                                                                                                                                                                                 
func (*WildTurkey) fly() {
    fmt.Println("I'm flying a short distance")
}
                                                                                                                                                                                                                                                                                 
//首先,需要实现想转换成的类型接口,也就是
//客户所期望看到的接口
type TurkeyAdapter struct {
    turkey  Turkey
}
                                                                                                                                                                                                                                                                                 
//接着,需要取得适配的对象引用
func NewTurkeyAdapter(turkey Turkey) *TurkeyAdapter {
    return &TurkeyAdapter{ turkey }
}
                                                                                                                                                                                                                                                                                 
//现在需要实现接口中所有的方法,
//quack在类之间的转换很简单,调用gobble就可以。
func (this *TurkeyAdapter) quack() {
    this.turkey.gobble()
}
                                                                                                                                                                                                                                                                                 
//两个接口都具备了fly方法,火鸡飞行距离短,
//要让火鸡和鸭子的飞行能对应,必须连续五次调用火鸡的fly
func (this *TurkeyAdapter) fly() {
    for i := 0; i < 5; i++ {
        this.turkey.fly()
    }
}