Go语言实现设计模式之「策略模式」

79 阅读1分钟

Code

简单实现一个策略模式,吃不同的水果

strategy.go

package strategy

import "fmt"

const (
   Apple      = "apple"
   Strawberry = "strawberry"
)

type PersonActionStrategy interface {
   Eat(name string)
   Fly()
}

var strategys = map[string]PersonActionStrategy{
   "apple":      appleStrategy{},
   "strawberry": strawberryStrategy{},
}

type appleStrategy struct{}
type strawberryStrategy struct{}

func (s appleStrategy) Eat(name string) {
   fmt.Println(fmt.Sprintf("%s eat an apple", name))
}
func (s strawberryStrategy) Eat(name string) {
   fmt.Println(fmt.Sprintf("%s eat a strawberry", name))
}
func (s appleStrategy) Fly() {
   fmt.Println("apple fly")
}
func (s strawberryStrategy) Fly() {
   fmt.Println("strawberry fly")
}
func NewPersonActionStrategy(fruit string) PersonActionStrategy {
   return strategys[fruit]
}

strategy_test.go

package strategy

import "testing"

func TestEatFruit(t *testing.T) {
   NewPersonActionStrategy(Apple).Eat("Bill")
   NewPersonActionStrategy(Strawberry).Eat("Bill")
   NewPersonActionStrategy(Apple).Fly()
   NewPersonActionStrategy(Strawberry).Fly()
}

run

=== RUN   TestEatFruit
Bill eat an apple
Bill eat a strawberry
apple fly
strawberry fly