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

时间:2017-09-17 15:06:25

标签: go composite

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

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作为组合对象不应该从外部接收名字,而是从运动员那里接收名字。有可能吗?

1 个答案:

答案 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()

看到它在这个游乐场工作:

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