没啥可讲,适配接口,默认接口,不能实现客户的要求,我们就去改。
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()
}
}