发布/订阅者模式
今天晚上加班到8:30,可是没有白天还有昨天有效率了。这几天真的很专注,一心在工作遇到的问题上。当很专注时,其实并不累,而且竟然把外部世界忘记了。完全忘记周围的一切,构思梳理思路的时候,尽量多想可能的情况,想如何把复杂的问题简单化。
技术书买了好久几乎都从未翻过,今天坐在车上翻了一会儿,看了golang高级编程那本书写的发布/订阅者模式的代码,觉得真是妙啊。golang有了通道,真的很好。
我想用自己理解的大概描述一下,今天看到的这个常见的发布/订阅者模式的代码。
首先要构建New一个发布者对象,当然构建的时候会传参有,读写锁,订阅队列的缓存大小(有缓冲通道),发布超时时间(发布内容往订阅者通道放数据时,如果因为缓冲满了会阻塞,阻塞的超时时间,如果超时了,订阅者将接收不到这个发布内容)。
订阅者是一个通道,因为订阅内容而成为订阅者,比如有的人订文学杂志,有的订报纸,要订什么,订阅者指定(过滤器),也可以指定可选的所有类型,比如来了一批待订的杂志,有的人不选,直接全订。订阅者,通道已经有了,有征订的人了。那么一有新的杂志发布,就会按照他们各自的需求送到各个订阅者那里。从通道那拿数据,接收到的就是想要的杂志。每个通道有容量,相当于信箱,信箱满了不能再放了,只有取信人从信箱中取出一部分或者全部,才能再往通道里面放。如果送信的人去了,等着有人先把信箱清理一部分,再放,等的超时了那个人还没清,可能不住在这里了,那就不送了扔掉(这个比喻可能不恰当)。
订阅者信息是一个map,通道ch类型的数据可以作为key值,value是一个过滤器函数,可以订阅主题时,把过滤器作为参数传入,这样,就会创建通道,并把此过滤器作为这个通道对应的value,订阅主题的函数,返回的是一个通道,发布者将会往这些通道放数据,前提是,要被这个通道对应的过滤器检查后,再判断是否放数据到这个通道。
订阅函数除了可以订阅自己指定了过滤器的通道,大概意思就是这条是机动车道只允许有某些条件的人通过,比如有工作证的条件,这条件就是过滤器。但有些道,谁都可以过。那么就需要一个订阅函数,返回一个不指定任何过滤器的通道。这个通道对应的谁发布东西,我都收,来者不拒。订阅的主题(过滤器)也可想成如公众号的关注,视频号的关注等。
退出订阅是,把通道传入退订函数,告诉他我不订了,那么再有发布的时候,这个通道已经不再去接收了。
此外我又翻了一些,有关协程和通道的使用,为什么我平时不翻翻呢,真的对技术能力的提升很有帮助。