2017-09-17 4 views
0

J'essaie de mettre en œuvre un motif de conception composite. J'ai compris comment composer un objet d'objet. Dans cet exemple, j'ai un athlète et la fonction de nage.Les composants de l'objet peuvent-ils se parler entre eux en mode composite?

type Athlete struct { 
    name string 
} 

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

Mais si je dois passer le nom après la création d'objet composé:

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

Est-il possible d'injecter une méthode qui est capable de lire dans l'objet où est injecté;

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) 
} 

Je voudrais que comp comme objet composé ne doit pas recevoir le nom de l'extérieur, mais de l'athlète. C'est possible?

Répondre

1

Oui, c'est possible.

Vous pouvez déclarer une méthode Train() pour CompositeAthlete, et cette méthode aurait accès à tous les champs (CompositeAthlete la fonction et la athlete).

Ensuite, vous pouvez utiliser la fonction depuis l'intérieur de la méthode.

Voici comment vous l'implémenterez, pour le rendre plus clair.

définition CompositeAthlete

(notez que j'ai changé le terrain pour TrainFunc afin qu'il ne soit pas incompatible avec le nom de la méthode)

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

Ensuite, la méthode Train() se contentait de faire:

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

Et vous l'utiliseriez presque le même que précédemment (seulement le champ na moi a changé):

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

voir travailler dans ce terrain de jeu:

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