mirror of
https://github.com/Estom/notes.git
synced 2026-02-08 13:05:57 +08:00
go知识重新整理
This commit is contained in:
51
Go/DesignPattern/observer/observer.go
Normal file
51
Go/DesignPattern/observer/observer.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package observer
|
||||
|
||||
import "fmt"
|
||||
|
||||
//观察者模式:用于触发联动,一个对象的改变会触发其他观察者的相关动作,而此对象无需关心联动对象的具体实现
|
||||
|
||||
func NewSubject() *Subject {
|
||||
return &Subject{
|
||||
observers: make([]Observer, 0),
|
||||
}
|
||||
}
|
||||
|
||||
type Subject struct {
|
||||
observers []Observer
|
||||
context string
|
||||
}
|
||||
|
||||
type Observer interface {
|
||||
Update(*Subject)
|
||||
}
|
||||
|
||||
func (s *Subject) Attach(o Observer) {
|
||||
s.observers = append(s.observers, o)
|
||||
}
|
||||
|
||||
//notify every observers
|
||||
func (s *Subject) notify() {
|
||||
for _, o := range s.observers {
|
||||
o.Update(s)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Subject) UpdateContext(context string) {
|
||||
s.context = context
|
||||
//notify all observers
|
||||
s.notify()
|
||||
}
|
||||
|
||||
func NewReader(name string) *Reader {
|
||||
return &Reader{
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
type Reader struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (r *Reader) Update(s *Subject) {
|
||||
fmt.Printf("%s receive %s\n", r.name, s.context)
|
||||
}
|
||||
23
Go/DesignPattern/observer/observer_test.go
Normal file
23
Go/DesignPattern/observer/observer_test.go
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* @Author:zhoutao
|
||||
* @Date:2020/12/12 上午10:49
|
||||
* @Desc:
|
||||
*/
|
||||
|
||||
package observer
|
||||
|
||||
func ExampleObserver() {
|
||||
Subject := NewSubject()
|
||||
|
||||
reader1 := NewReader("reader1")
|
||||
reader2 := NewReader("reader2")
|
||||
reader3 := NewReader("reader3")
|
||||
|
||||
Subject.Attach(reader1)
|
||||
Subject.Attach(reader2)
|
||||
Subject.Attach(reader3)
|
||||
|
||||
//update and notify all obervers
|
||||
Subject.UpdateContext("observer mode")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user