网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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"})
}
观察者模式优点
- 你无需修改被观察者代码就能引入新的观察者
- 你可以在运行时建立对象之间的联系
观察者模式缺点
- 观察者的通知顺序是随机的
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
适用场景
- 回退场景、撤销重做
- 备份与还原、快照与恢复
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)
}
备忘录模式优点
- 能够很方便的回到某个历史状态
- 实现了信息的封装,使用方不需要关心状态的保存细节
备忘录模式缺点
- 消耗资源
中介者模式
定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解
适用场景
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!