最近学习了一下订阅者模式。根据网上的说法。订阅者模式和观察者模式的主要的区别是否有通道。观察模式是观察者和订阅者直接关联。而订阅者模式是发布者和订阅者中间会有一个通道来过渡,发布者发布消息到通道,不关心发送给谁。同时订阅者从通道中读取消息。
以下是这次的练习,具体是不是符合大家可以纠正。
package dingyuezhe
import "fmt"
type Channel struct {
userName string
}
type Channels struct{
chann map[string]map[string]Channel
}
//注册订阅者
func (ch *Channels) Reg(appId string,userId string,userName string) {
c := new(Channel)
c.userName = userName
if ch.chann == nil {
ch.chann = make(map[string]map[string]Channel)
}
if ch.chann[appId] == nil {
ch.chann[appId] = make(map[string]Channel)
}
ch.chann[appId][userId] = *c
}
//取消订阅
func (ch *Channels) Remove(appId string,userId string) {
if ch.chann[appId] == nil {
fmt.Println("该通道不存在")
}else {
delete(ch.chann[appId],userId)
}
}
//发送消息
func (ch *Channels) Send(appId string,msg string) {
for k,v := range ch.chann[appId] {
fmt.Println(appId,k,v.userName,msg)
}
}
package main
import "test/dingyuezhe"
func main() {
c := new(dingyuezhe.Channels)
c.Reg("1","1","小红")
c.Reg("1","2","小明")
c.Reg("2","2","小明")
c.Send("1","大家好")
c.Send("2","大家好")
c.Remove("1","2")
c.Send("1","你好")
}
这里是运行结果:
1 1 小红 大家好
1 2 小明 大家好
2 2 小明 大家好
1 1 小红 你好