Go语言实现23种设计模式之行为型模式(中)
admin
2024-04-22 20:22:03
0

使用Go实现23种设计模式——行为型模式(中)

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

适用场景

  1. 对一个对象状态或数据的更新需要其他对象同步更新,或者一个对象的更新需要依赖另一个对象的更新
  2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节,如消息推送等

Go语言实现

type Event struct {Data string
}type IObServer interface {Update(event *Event)
}type ISubject interface {Register(server IObServer)Remove(server IObServer)Notify(event *Event)
}type ObServer struct {Id int
}func (s *ObServer) Update(event *Event) {fmt.Printf("observer %d msg: %s", s.Id, event.Data)
}type Subject struct {ObServers map[IObServer]struct{}
}func NewSubject() *Subject {return &Subject{ObServers: make(map[IObServer]struct{})}
}func (s *Subject) Register(server IObServer) {s.ObServers[server] = struct{}{}
}func (s *Subject) Remove(server IObServer) {delete(s.ObServers, server)
}func (s *Subject) Notify(event *Event) {for ob, _ := range s.ObServers {ob.Update(event)}
}func main() {s := NewSubject()o1 := ObServer{Id: 1}o2 := ObServer{Id: 2}s.Register(&o1)s.Register(&o2)s.Notify(&Event{Data: "123"})
}

观察者模式优点

  1. 你无需修改被观察者代码就能引入新的观察者
  2. 你可以在运行时建立对象之间的联系

观察者模式缺点

  1. 观察者的通知顺序是随机的

备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

适用场景

  1. 回退场景、撤销重做
  2. 备份与还原、快照与恢复

Go语言实现

type Memento struct {State string
}func (m *Memento) SetState(s string) {m.State = s
}func (m *Memento) GetState() string {return m.State
}func (m *Memento) CreateMemento() *Memento {return &Memento{State: m.State}
}type CareTaker struct {memento *Memento
}func (c *CareTaker) GetMemento() *Memento {return c.memento
}func (c *CareTaker) SetMemento(m *Memento) {c.memento = m
}func main() {o := Memento{State: "running"}fmt.Printf("当前状态: %s", o.State)c := new(CareTaker)c.SetMemento(o.CreateMemento())o.SetState("finish")fmt.Printf("修改后的状态: %s", o.State)o.SetState(c.GetMemento().GetState())fmt.Printf("还原后的状态: %s", o.State)
}

备忘录模式优点

  1. 能够很方便的回到某个历史状态
  2. 实现了信息的封装,使用方不需要关心状态的保存细节

备忘录模式缺点

  1. 消耗资源

中介者模式

定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解

适用场景

  1. 系统中的对象之间存在复杂的引用关系,如相互依赖
  2. 存在交互的公共行为,如果需要改变行为可增加中介者类

Go语言实现

type Item interface {SendMsg(msg string)GetMsg(msg string)
}type User struct {mediator *Mediator
}func (u *User) SendMsg(msg string) {u.mediator.ForwardMsg(u, msg)
}func (u *User) GetMsg(msg string) {fmt.Printf("user get msg: %s: ", msg)
}type Server struct {mediator *Mediator
}func (s *Server) SendMsg(msg string) {s.mediator.ForwardMsg(s, msg)
}func (s *Server) GetMsg(msg string) {fmt.Printf("server get msg: %s", msg)
}type Mediator struct {UserServer
}func (m *Mediator) ForwardMsg(item Item, msg string) {switch item.(type) {case *User:m.Server.GetMsg(msg)breakcase *Server:m.User.GetMsg(msg)breakdefault:fmt.Printf("Error")}
}func main() {mediator := Mediator{}u := User{}s := Server{}mediator.User = umediator.Server = su.SendMsg("Hello")s.SendMsg("Hi")
}

中介者模式优点

  1. 减少类间的依赖,降低类间耦合

中介者模式缺点

  1. 当同事类越多时中介者就越臃肿

相关内容

热门资讯

低俗赌约引爆股价涨停,股民瞠目... 2026.07.06本文字数:851,阅读时长大约1分钟作者 |第一财经 安卓封图 |AI生成一个低...
快手公告:腾讯减持,不再为公司... 快手在港交所公告,已获悉腾讯于2026年7月6日,透过场外大宗交易方式向若干买方出售合共272947...
保时捷考虑在德国再裁减4000... 当地时间7月5日,据报道,知情人士表示,保时捷考虑在其祖文豪森工厂再裁员多达4000人,此前该公司已...
潜射战略导弹,发射画面公布! 7月6日12时01分,中国海军1艘战略核潜艇成功发射1发携载训练模拟弹头的潜射战略导弹,准确落入预定...
红色引擎激活金融活力!券商银行... 金融是国民经济的血脉。在迈向高质量发展的新征程上,一批证券公司及商业银行等金融机构,正将党建“红色引...
深交所通报中公教育股票交易情况... 7月6日晚,深交所发布通报:2026年7月6日,中公教育(002607)股票价格出现异常波动,上市公...
算力赛道暗藏黑马!“电子大米”... 今日A股整体呈现高开震荡、结构性分化格局,硬件、半导体板块强势领涨,算力产业链持续获得资金青睐。在A...
微软计划裁员约4800人,股价... 7月6日晚,微软股价走低,一度下跌2%,现跌1.47%。消息面上,报道称微软计划裁员约4800人,其...
上半年上海16家硬科技企业赴港... 2026.07.06本文字数:1066,阅读时长大约2分钟作者 |第一财经 金叶子衡量一座城市科技发...
存储芯片+国产替代+AI算力!... A股收盘【创业板指跌1.77% 煤炭板块逆市走强】四大股指今日集体收跌,沪指跌0.06%,深成指跌1...