go 对象组件可以以复合模式相互通信吗?

Can go object components talk to each others in composite pattern?

我正在尝试实现复合设计模式。我了解了如何组合对象的对象。在这个例子中,我有一个运动员和游泳功能。

type Athlete struct {
    name string
}

type CompositeAthlete struct {
    athlete Athlete
    Train   func(name string)
}

但是如果我需要在创建组合对象后传递名称:

    comp := CompositeAthlete{
        athlete: athlete,
        Train:   Swim,
    }
    comp.Train(athlete.name)

是否可以注入一个能够读取被注入对象内部的方法;

package main

import (
    "fmt"
    "strings"
)

type Athlete struct {
    name string
}

type CompositeAthlete struct {
    athlete Athlete
    Train   func(name string)
}

func (a *Athlete) Train() {
    fmt.Println("training ...")
}

func Swim(name string) {
    fmt.Println(strings.Join([]string{
        name,
        " is swimming",
    }, ""))
}

func main() {
    fmt.Println("vim-go")

    athlete := Athlete{"Mariottide"}
    athlete.Train()

    comp := CompositeAthlete{
        athlete: athlete,
        Train:   Swim,
    }
    comp.Train(athlete.name)
}

我希望 comp 作为组合对象不应该从外部接收名称,而是从运动员接收名称。可能吗?

是的,有可能。

您可以为 CompositeAthlete 声明一个 Train() 方法,该方法可以访问所有 CompositeAthlete 字段(函数和 athlete)。

然后就可以在方法内部使用函数了。

以下是您的实施方式,以使其更加清晰。

综合运动员定义

(注意我把字段改成了TrainFunc,这样才不会和方法名冲突)

type CompositeAthlete struct {
    athlete Athlete
    TrainFunc   func(name string)
}

那么 Train() 方法就可以:

func (c *CompositeAthlete) Train() {
    c.TrainFunc(c.athlete.name)
}

并且你会像以前一样使用它(只是字段名称发生了变化):

comp := CompositeAthlete{
    athlete: athlete,
    TrainFunc:   Swim,
}
comp.Train()

看到它在这个操场上工作:

https://play.golang.org/p/xibH_tFers