Design patterns

Observer model

Observer Pattern, also known as publish-subscribe Design Pattern

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Translation:

Define a one-to-many dependency between objects so that when an object’s state changes, all dependent objects are automatically notified.

observer-mode

Application scenarios

The observer mode requires three conditions: the observer is observed and the topic is subscribed

The actual scenario could be:

  • Public account push message, independent wechat attention to multiple public account, each time can always receive updates issued by the public account, subscription account will mark the top of the public account red reminder
  • Email subscriptions
  • RSS Feeds

code

package observer import "fmt" type Subject struct { observers []Observer context string } func NewSubject() *Subject { return &Subject{ observers: make([]Observer, 0), } } func (s *Subject) Attach(o Observer) { s.observers = append(s.observers, o) } func (s *Subject) notify() { for _, o := range s.observers { o.Update(s) } } func (s *Subject) UpdateContext(context string) { s.context = context s.notify() } type Observer interface { Update(*Subject) } type Reader struct { name string } func NewReader(name string)  *Reader { return &Reader{ name: name, } } func (r *Reader) Update(s *Subject) { fmt.Printf("%s receive %s\n", r.name, s.context) }Copy the code

The test code

package observer

func ExampleObserver() {
	subject := NewSubject()
	reader1 := NewReader("reader1")
	reader2 := NewReader("reader2")
	reader3 := NewReader("reader3")
	subject.Attach(reader1)
	subject.Attach(reader2)
	subject.Attach(reader3)

	subject.UpdateContext("observer mode")
	// Output:
	// reader1 receive observer mode
	// reader2 receive observer mode
	// reader3 receive observer mode
}
Copy the code
Welcome to: Programmer developer community

The resources

  • Github.com/senghoo/gol…