2
14 观察者模式 -- go语言设计模式
source link: https://blog.51cto.com/u_14483476/7093633
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
14 观察者模式 -- go语言设计模式
精选 原创观察者模式也叫做发布-订阅模式。观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到它订阅的通知。
观察者模式的实现代码
package main
import "fmt"
//--------- 抽象层 --------
//抽象的观察者
type Listener interface {
OnTeacherComming() //观察者得到通知后要触发的动作
}
type Notifier interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
Notify()
}
//--------- 实现层 --------
//观察者学生
type StuZhang3 struct {
Badthing string
}
func (s *StuZhang3) OnTeacherComming() {
fmt.Println("张3 停止 ", s.Badthing)
}
func (s *StuZhang3) DoBadthing() {
fmt.Println("张3 正在", s.Badthing)
}
type StuZhao4 struct {
Badthing string
}
func (s *StuZhao4) OnTeacherComming() {
fmt.Println("赵4 停止 ", s.Badthing)
}
func (s *StuZhao4) DoBadthing() {
fmt.Println("赵4 正在", s.Badthing)
}
type StuWang5 struct {
Badthing string
}
func (s *StuWang5) OnTeacherComming() {
fmt.Println("王5 停止 ", s.Badthing)
}
func (s *StuWang5) DoBadthing() {
fmt.Println("王5 正在", s.Badthing)
}
//通知者班长
type ClassMonitor struct {
listenerList []Listener //需要通知的全部观察者集合
}
func (m *ClassMonitor) AddListener(listener Listener) {
m.listenerList = append(m.listenerList, listener)
}
func (m *ClassMonitor) RemoveListener(listener Listener) {
for index, l := range m.listenerList {
//找到要删除的元素位置
if listener == l {
//将删除的点前后的元素链接起来
m.listenerList = append(m.listenerList[:index], m.listenerList[index+1:]...)
break
}
}
}
func (m* ClassMonitor) Notify() {
for _, listener := range m.listenerList {
//依次调用全部观察的具体动作
listener.OnTeacherComming()
}
}
func main() {
s1 := &StuZhang3{
Badthing: "抄作业",
}
s2 := &StuZhao4{
Badthing: "玩王者荣耀",
}
s3 := &StuWang5{
Badthing: "看赵四玩王者荣耀",
}
classMonitor := new(ClassMonitor)
fmt.Println("上课了,但是老师没有来,学生们都在忙自己的事...")
s1.DoBadthing()
s2.DoBadthing()
s3.DoBadthing()
classMonitor.AddListener(s1)
classMonitor.AddListener(s2)
classMonitor.AddListener(s3)
fmt.Println("这时候老师来了,班长给学什么使了一个眼神...")
classMonitor.Notify()
}
观察者模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 observer_mode 里创建新文件夹
// observer -- 存放装饰者的全部文件
3.接口文件 – observer文件夹
文件1 – listener.go
package observer
//抽象的观察者
type Listener interface {
OnTeacherComming() //观察者得到通知后要触发的动作
}
文件2 – notifier.go
package observer
// 抽象通知人
type Notifier interface {
AddListener(listener Listener)
RemoveListener(listener Listener)
Notify()
}
4.结构体文件 – observer文件夹
文件1 – stuzhang3.go
package observer
import "fmt"
//观察者学生
type StuZhang3 struct {
Badthing string
}
func (s *StuZhang3) OnTeacherComming() {
fmt.Println("张3 停止 ", s.Badthing)
}
func (s *StuZhang3) DoBadthing() {
fmt.Println("张3 正在", s.Badthing)
}
文件2 – zhao4.go
package observer
import "fmt"
//观察者学生
type StuZhao4 struct {
Badthing string
}
func (s *StuZhao4) OnTeacherComming() {
fmt.Println("赵4 停止 ", s.Badthing)
}
func (s *StuZhao4) DoBadthing() {
fmt.Println("赵4 正在", s.Badthing)
}
文件3 – stuwang5.go
package observer
import "fmt"
//观察者学生
type StuWang5 struct {
Badthing string
}
func (s *StuWang5) OnTeacherComming() {
fmt.Println("王5 停止 ", s.Badthing)
}
func (s *StuWang5) DoBadthing() {
fmt.Println("王5 正在", s.Badthing)
}
文件4 – classmonitor.go
package observer
//通知者班长
type ClassMonitor struct {
listenerList []Listener //需要通知的全部观察者集合
}
func (m *ClassMonitor) AddListener(listener Listener) {
m.listenerList = append(m.listenerList, listener)
}
func (m *ClassMonitor) RemoveListener(listener Listener) {
for index, l := range m.listenerList {
//找到要删除的元素位置
if listener == l {
//将删除的点前后的元素链接起来
m.listenerList = append(m.listenerList[:index], m.listenerList[index+1:]...)
break
}
}
}
func (m* ClassMonitor) Notify() {
for _, listener := range m.listenerList {
//依次调用全部观察的具体动作
listener.OnTeacherComming()
}
}
5.主文件 – main.go 在项目文件夹
package main
import (
"design/observer_mode/observer"
"fmt"
)
func main() {
s1 := &(observer.StuZhang3{
Badthing: "抄作业",
})
s2 := &(observer.StuZhao4{
Badthing: "玩王者荣耀",
})
s3 := &observer.StuWang5{
Badthing: "看赵四玩王者荣耀",
}
classMonitor := new(observer.ClassMonitor)
fmt.Println("上课了,但是老师没有来,学生们都在忙自己的事...")
s1.DoBadthing()
s2.DoBadthing()
s3.DoBadthing()
classMonitor.AddListener(s1)
classMonitor.AddListener(s2)
classMonitor.AddListener(s3)
fmt.Println("这时候老师来了,班长给学什么使了一个眼神...")
classMonitor.Notify()
}
6.全部文件图
- 赞
- 收藏
- 评论
- 分享
- 举报
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK