Go语言进阶:设计模式 - 行为型模式(第二节)

观察者模式 (Observer)

  • 核心概念:定义对象间一对多依赖关系
  • Go实现:通道与回调函数
  • 场景:事件通知、实时数据更新
  • 代码示例:
type Subject struct {
    observers []Observer
    state     string
}

func (s *Subject) Attach(observer Observer) {
    s.observers = append(s.observers, observer)
}

func (s *Subject) SetState(state string) {
    s.state = state
    s.NotifyAll()
}

func (s *Subject) NotifyAll() {
    for _, observer := range s.observers {
        observer.Update(s.state)
    }
}

type Observer interface {
    Update(state string)
}

状态模式 (State)

  • 核心概念:允许对象在内部状态改变时改变行为
  • Go实现:状态接口
  • 场景:工作流引擎、游戏角色状态
  • 代码示例:
type State interface {
    Handle(context *Context)
}

type Context struct {
    state State
}

func (c *Context) Request() {
    c.state.Handle(c)
}

func (c *Context) SetState(state State) {
    c.state = state
}

type ConcreteStateA struct{}
func (s *ConcreteStateA) Handle(context *Context) {
    fmt.Println("State A handling")
    context.SetState(&ConcreteStateB{})
}

type ConcreteStateB struct{}
func (s *ConcreteStateB) Handle(context *Context) {
    fmt.Println("State B handling")
    context.SetState(&ConcreteStateA{})
}

策略模式 (Strategy)

  • 核心概念:定义算法族,封装每个算法,使它们可互换
  • Go实现:接口策略
  • 场景:支付方式、排序算法
  • 代码示例:
type PaymentStrategy interface {
    Pay(amount float64) string
}

type CreditCardStrategy struct{}
func (c *CreditCardStrategy) Pay(amount float64) string {
    return fmt.Sprintf("Paid %.2f using Credit Card", amount)
}

type PayPalStrategy struct{}
func (p *PayPalStrategy) Pay(amount float64) string {
    return fmt.Sprintf("Paid %.2f using PayPal", amount)
}

type PaymentContext struct {
    strategy PaymentStrategy
}

func (p *PaymentContext) ExecutePayment(amount float64) string {
    return p.strategy.Pay(amount)
}

模板方法模式 (Template Method)

  • 核心概念:定义算法骨架,将步骤延迟到子类
  • Go实现:嵌入结构体
  • 场景:工作流、数据处理管道
  • 代码示例:
type Game interface {
    Start()
    TakeTurn()
    HaveWinner() bool
    WinningPlayer() int
}

func PlayGame(g Game) {
    g.Start()
    for !g.HaveWinner() {
        g.TakeTurn()
    }
    fmt.Printf("Player %d wins\n", g.WinningPlayer())
}

type Chess struct {
    turn, maxTurns, currentPlayer int
}

func (c *Chess) Start() {
    fmt.Println("Starting chess game")
}

func (c *Chess) TakeTurn() {
    c.turn++
    fmt.Printf("Turn %d taken by player %d\n", c.turn, c.currentPlayer)
    c.currentPlayer = 1 - c.currentPlayer
}

func (c *Chess) HaveWinner() bool {
    return c.turn == c.maxTurns
}

func (c *Chess) WinningPlayer() int {
    return c.currentPlayer
}

访问者模式 (Visitor)

  • 核心概念:在不改变元素类的前提下定义新操作
  • Go实现:双重分派
  • 场景:编译器AST遍历、文档处理
  • 代码示例:
type Visitor interface {
    VisitForSquare(*Square)
    VisitForCircle(*Circle)
}

type Shape interface {
    Accept(visitor Visitor)
}

type Square struct {
    side float64
}

func (s *Square) Accept(v Visitor) {
    v.VisitForSquare(s)
}

type AreaCalculator struct {
    area float64
}

func (a *AreaCalculator) VisitForSquare(s *Square) {
    a.area = s.side * s.side
}

func (a *AreaCalculator) VisitForCircle(c *Circle) {
    a.area = math.Pi * c.radius * c.radius
}
原文链接:,转发请注明来源!