Skip to content

Commit

Permalink
observer
Browse files Browse the repository at this point in the history
  • Loading branch information
ibarryyan committed Sep 3, 2023
1 parent 239616c commit 80da697
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 0 deletions.
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions .idea/git_toolbox_prj.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/go-design-patterns.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions code/05-factory/product.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package _5_factory
1 change: 1 addition & 0 deletions code/05-factory/product_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package _5_factory
49 changes: 49 additions & 0 deletions code/08-observer/notify_observer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package _8_observer

import (
"fmt"
)

// Subject 是被观察者
type Subject struct {
observers []Observer
state string
}

// Register 注册观察者
func (s *Subject) Register(observer Observer) {
s.observers = append(s.observers, observer)
}

// SetState 设置状态并通知观察者
func (s *Subject) SetState(state string) {
s.state = state
s.Notify()
}

// Notify 通知所有观察者
func (s *Subject) Notify() {
for _, observer := range s.observers {
go observer.Update(s.state) // 使用协程避免阻塞
}
}

// Observer 观察者接口
type Observer interface {
Update(string)
}

// ConcreteObserver1 具体观察者1
type ConcreteObserver1 struct{}

func (o ConcreteObserver1) Update(state string) {
fmt.Printf("ConcreteObserver1 received state: %s\n", state)
}

// ConcreteObserver2 具体观察者2
type ConcreteObserver2 struct{}

func (o ConcreteObserver2) Update(state string) {
fmt.Printf("ConcreteObserver2 received state: %s\n", state)
}

18 changes: 18 additions & 0 deletions code/08-observer/notify_observer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package _8_observer

import (
"testing"
"time"
)

func TestName(t *testing.T) {
subject := Subject{}
observer1 := ConcreteObserver1{}
observer2 := ConcreteObserver2{}

subject.Register(observer1) // 注册观察者1
subject.Register(observer2) // 注册观察者2

subject.SetState("new state") // 设置状态并通知观察者
time.Sleep(5*time.Second)
}

0 comments on commit 80da697

Please sign in to comment.