Skip to content

Commit 9bf0ece

Browse files
committed
observer
1 parent 6b3e413 commit 9bf0ece

File tree

3 files changed

+89
-1
lines changed

3 files changed

+89
-1
lines changed

Decorator/decoator_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ func TestPi(t *testing.T) {
1515
}
1616

1717
func TestWrapLogger(t *testing.T) {
18-
1918
f:= WrapLogger(Pi,log.New(os.Stdout,"test ",1))
2019
f(100000)
2120
}

Observer/observer.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package Observer
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"time"
7+
)
8+
9+
type Event struct {
10+
Data int
11+
}
12+
13+
type Observer interface {
14+
NotifyCallback(event Event)
15+
}
16+
17+
type Subject interface {
18+
AddListener(observer Observer)
19+
RemoveListener(observer Observer)
20+
Notify(event Event)
21+
}
22+
23+
type eventObserver struct {
24+
ID int
25+
Time time.Time
26+
}
27+
28+
type eventSubject struct {
29+
Observers sync.Map
30+
}
31+
32+
func (e eventObserver) NotifyCallback(event Event) {
33+
fmt.Printf("Recieved:%d after %v\n", event.Data, time.Since(e.Time))
34+
}
35+
36+
func (e *eventSubject) AddListener(obs Observer) {
37+
e.Observers.Store(obs, struct{}{})
38+
}
39+
40+
func (e *eventSubject) RemoveListener(obs Observer) {
41+
e.Observers.Delete(obs)
42+
}
43+
44+
func (e *eventSubject) Notify(event Event) {
45+
e.Observers.Range(func(key, value interface{}) bool {
46+
if key == nil {
47+
return false
48+
}
49+
key.(Observer).NotifyCallback(event)
50+
return true
51+
})
52+
}
53+
54+
func Fib(n int) chan int{
55+
out := make(chan int)
56+
go func() {
57+
defer close(out)
58+
for i,j:=0,1; i<n;i,j=i+j,i{
59+
out <-i
60+
}
61+
}()
62+
return out
63+
}

Observer/observer_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package Observer
2+
3+
import (
4+
"sync"
5+
"testing"
6+
"time"
7+
)
8+
9+
func TestFib(t *testing.T) {
10+
//for x:=range Fib(20){
11+
// fmt.Println(x)
12+
//}
13+
14+
n := eventSubject{Observers:sync.Map{}}
15+
16+
obs1:= eventObserver{ID:1,Time:time.Now()}
17+
obs2:= eventObserver{ID:2,Time:time.Now()}
18+
19+
n.AddListener(obs1)
20+
n.AddListener(obs2)
21+
22+
for x:=range Fib(10){
23+
n.Notify(Event{Data:x})
24+
}
25+
}
26+

0 commit comments

Comments
 (0)