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()
看到它在这个操场上工作:
我正在尝试实现复合设计模式。我了解了如何组合对象的对象。在这个例子中,我有一个运动员和游泳功能。
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()
看到它在这个操场上工作: