From 0580ec9c6e392c992510ceb25239804478fc9cf8 Mon Sep 17 00:00:00 2001 From: ismayilmalik Date: Sat, 13 Jan 2018 23:49:30 +0400 Subject: [PATCH] implemented observer pattern --- README.md | 10 ++++++--- behavioral/observer/observer.go | 38 ++++++++++++++++++++++++++++++++ logo.png | Bin 0 -> 34759 bytes structural/proxy/proxy.go | 0 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 behavioral/observer/observer.go create mode 100644 logo.png create mode 100644 structural/proxy/proxy.go diff --git a/README.md b/README.md index 4336e3f..4b33677 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -![alt text][gooopher] - -[gooopher]:https://raw.githubusercontent.com/ismayilmalik/golang-design-patterns/master/gopher.jpg "Gooopher.." +design patterns logo +
+
# Design patterns in golang >A beginner guide... happy coding! @@ -20,6 +20,7 @@ - [Behavioral patterns](#behavioral-patterns) - [Chain of responsibility](#chain-of-responsibility) - [Strategy](#strategy) + - [Observer](#observer) - [Concurrency patterns](#concurrency-patterns) --- @@ -78,5 +79,8 @@ request along the chain until an object handles it. Define a family oafl gorit h ms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. +### Observer +Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically + ## Concurrency patterns Pattenrs for concurrent work and parallel execution in Go. diff --git a/behavioral/observer/observer.go b/behavioral/observer/observer.go new file mode 100644 index 0000000..5d2c760 --- /dev/null +++ b/behavioral/observer/observer.go @@ -0,0 +1,38 @@ +package observer + +import ( + "fmt" +) + +type Observer interface { + Notify(string) +} + +type Publisher struct { + ObserverList []Observer +} + +func (p *Publisher) Subscribe(o Observer) { + p.ObserverList = append(p.ObserverList, o) +} + +func (p *Publisher) Unsubscribe(o Observer) { + var index int + for i, v := range p.ObserverList { + if v == o { + index = i + break + } + } + + p.ObserverList = append(p.ObserverList[:index], p.ObserverList[index + 1:]...) +} + +func (p *Publisher) Publish(m string) { + fmt.Println("Got new message! Publishing...") + for _, o := range p.ObserverList { + o.Notify(m) + } + fmt.Println("Puplished!") +} + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..65b2f5a4c0b83022528cfbca8d733f5b8e2d28d4 GIT binary patch literal 34759 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�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%0Dx;Kn(JM`u)o8tGI_vZUb!`I4;|U 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 PN8OQAlP#4od;0$YVYRNJ literal 0 HcmV?d00001 diff --git a/structural/proxy/proxy.go b/structural/proxy/proxy.go new file mode 100644 index 0000000..e69de29