订阅者模式-golang

        最近学习了一下订阅者模式。根据网上的说法。订阅者模式和观察者模式的主要的区别是否有通道。观察模式是观察者和订阅者直接关联。而订阅者模式是发布者和订阅者中间会有一个通道来过渡,发布者发布消息到通道,不关心发送给谁。同时订阅者从通道中读取消息。

        以下是这次的练习,具体是不是符合大家可以纠正。

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 小红 你好





发布了48 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/aixinaxc/article/details/80437287