我正在尝试实现复合设计模式。我理解如何构成一个物体的对象。在这个例子中,我有一个运动员和游泳功能。
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
作为组合对象不应该从外部接收名字,而是从运动员那里接收名字。有可能吗?
答案 0 :(得分:1)
是的,这是可能的。
您可以为Train()
声明CompositeAthlete
方法,该方法可以访问所有CompositeAthlete
字段(函数和athlete
)。
然后你可以使用方法内部的函数。
以下是您如何实施它,以使其更加清晰。
CompositeAthlete定义
(请注意,我已将字段更改为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()
看到它在这个游乐场工作: