Go의 전략 패턴

9381 단어 godesignpattern
새를 시뮬레이션하는 프로그램을 작성해야 한다고 상상해 보십시오.

다른 비행 행동을 가진 다른 유형의 새가있을 수 있습니다.

낮게 나는 앵무새, 높이 나는 독수리, 날지 않는 타조

Bird 인터페이스부터 시작하겠습니다.

// Interface
type Bird interface {
    Fly()
    Display()
}


따라서 Fly() 및 Display()를 구현하는 모든 것이 Bird입니다.

앵무새

type Parrot struct {
    color string
}

func (p *Parrot) Fly() {
    fmt.Println("I can fly")
}

func (p *Parrot) Display() {
    fmt.Printf("I am a Parrot . I have color =%s", p.color)
}


또는 독수리

type Eagle struct {
    color string
}

func (p *Eagle) Fly() {
    fmt.Println("I can fly high")
}

func (p *Eagle) Display() {
    fmt.Printf("I am a Eagle . I have color =%s", p.color)
}


보시다시피 Fly()는 많은 입찰에 대한 공통 메커니즘이므로 이를 공통 구조로 옮길 수 있습니다.

Java에서는 몇 가지 공통 메서드가 구현된 추상 클래스를 만들고 나중에 추상 클래스를 확장하여 다양한 동작을 구현합니다.

Go에서는 Fly() 메서드를 부분적으로 구현하는 유형을 만들 수 있습니다.

//abstracting out just flying behaviour

type FlyStrategy struct {
    doFly FlyBehaviour
}

func (f *FlyStrategy) Fly() {
    f.doFly()
}


FlyBehaviour로 새가 나는 방법을 추출합니다.

type FlyBehaviour func()

func FlywithWings() {
   fmt.Println("I am  flying with my wings")
}

func FlyNoWay() {
   fmt.Println("I can't fly")
}

func FlyHigh(){
   fmt.Println("I am  flying high")
}


이제 Java에서 이 동작을 확장하려면 extend를 사용하지만 Go는 고전적인 의미에서 상속을 지원하지 않습니다. 대신 in은 유형의 기능을 확장하는 방법으로 구성을 권장합니다. Go는 보다 원활한 유형 구성을 표현하기 위해 구조체 및 인터페이스의 삽입을 지원합니다.

따라서 FlyStrategy를 확장하기 위해 간단히 Parrot 유형에 삽입합니다.

// Implementation of Parrot with FlyStrategy embed
type Parrot struct {
    color string
    FlyStrategy
}

func (p *Parrot) Display() {
    fmt.Printf("I am a Parrot . I have color = %s", p.color)
}

func main() {

    var greenParrot Bird

    greenParrot = &Parrot{
        color:       "green",
        FlyStrategy: FlyStrategy{doFly: FlywithWings},
    }

    greenParrot.Fly()
    greenParrot.Display()

}


이 패턴의 장점은 비행 전략을 동적으로 업데이트할 수 있다는 것입니다.

// Interface
type Bird interface {
    Fly()
    Display()
//new
    UpdateFlyStrategy(flyb FlyBehaviour)
}

....
....

type FlyStrategy struct {
    doFly FlyBehaviour
}

func (f *FlyStrategy) Fly() {
    f.doFly()
}

//new
func (f *FlyStrategy) UpdateFlyStrategy(flyb FlyBehaviour) {
    f.doFly = flyb
}

....
....

greenParrot.UpdateFlyStrategy(FlyHigh)
greenParrot.Fly()

좋은 웹페이지 즐겨찾기