2017-09-17 5 views
0

Ich versuche, Composite-Design-Muster zu implementieren. Ich verstand, wie man ein Objektobjekt zusammenstellt. In diesem Beispiel habe ich einen Athleten und die Schwimmfunktion.Können Objektkomponenten in einem zusammengesetzten Muster miteinander kommunizieren?

type Athlete struct { 
    name string 
} 

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

Aber wenn ich brauche den Namen nach komponierten Objekterstellung weitergeben müssen:

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

Ist es möglich, ein Verfahren zu injizieren, die innerhalb des Objekts zu lesen ist in der Lage, wo eingespritzt wird;

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

würde ich die comp als zusammengesetzt Objekt wie sollte nicht von außen Namen erhalten, sondern von Athleten. Ist es möglich?

Antwort

1

Ja, es ist möglich.

Sie können eine Train() Methode für CompositeAthlete erklären und diese Methode würde den Zugriff auf alle CompositeAthlete Felder (die Funktion und die athlete).

Dann können Sie die Funktion innerhalb der Methode verwenden.

Hier ist, wie Sie es implementieren würden, um es klarer zu machen.

CompositeAthlete Definition

(beachten Sie, dass ich das Feld zu TrainFunc geändert haben, so dass es nicht mit dem Methodennamen in Konflikt)

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

Dann wird die Train() Methode würde nur tun:

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

Und Sie würden es fast das gleiche wie vorher verwenden (nur das Feld na mich hat sich geändert):

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

Sehen sie in diesem Spielplatz arbeiten:

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

Verwandte Themen