2017-09-17 18 views
0

복합 디자인 패턴을 구현하려고합니다. 나는 물체의 대상을 어떻게 구성 하는지를 이해했다. 이 예에서는 운동 선수와 수영 기능이 있습니다.오브젝트 구성 요소는 합성 패턴으로 서로 통신 할 수 있습니까?

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

예, 가능합니다.

CompositeAthlete에 대해 Train() 메서드를 선언 할 수 있으며이 메서드는 모든 CompositeAthlete 필드 (함수 및 athlete)에 액세스 할 수 있습니다.

그러면 메서드 내부에서 함수를 사용할 수 있습니다.

다음은 더 명확하게 구현하는 방법입니다.

CompositeAthlete 정의

(나는 그것이 메소드 이름과 충돌하지 않도록하는 것이 TrainFunc에 필드를 변경 주)

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

는 그 다음 Train() 방법은 단지 할 것 :

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

그리고 이전과 거의 동일하게 사용할 수 있습니다 (필드 na 만). 나) 변경되었습니다

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

:

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

은이 놀이터에서 작업보기