东风草堂blog

公众号:来风说


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

基于模板实现的观察者模式C++

发表于 2021-08-15 | 更新于: 2024-05-18 | 分类于 设计模式 |
这个设计模式的功能就是实现订阅与发布的功能,一旦有消息更新,即可将最新的消息同步给所有的订阅者,无需订阅者主动来询问,如果订阅者无需这些消息了,只需要取消订阅即可,后续有新的消息就不会再次打扰。 适用于对于相同的数据需要表现为不同的行为的功能,比如,得知爸爸要回来了,儿子就会立马停止玩游戏,妈妈立马开始准备晚餐。也有可能是很多人都想订阅这些数据,比如求职者先将要找工作的需求交给猎头,猎头那里有很多这样的需求,一旦有公司有需求,猎头那里就会立马通知所有的要找这份工作的求职者,让他们分别去面试,公司选择优秀的人才入职。 生活中有很多类似的场景,都可以用观察者模式来解释,所以设计模式的灵感也来源于生活。另外一方面,也实现了逻辑与应用的分离,从上面的例子也可以看出,底层数据只有一份,但是可以用在几个不同的场景,如果新的场景,也就相当于多了一个订阅者而已。 基于模板实现的观察者模式网上面有很多实现了的观察者模式,用的都是普通类,但由于模型应用场景,比如订阅的消息类型各式各样,有string、int或者自定义class,那就需要改用模板类了。 由普通类改为模板类确实费了一点功夫,主要是对于模板类的 ...
阅读全文 »

公众号迁移开留言复杂吗?只要给资料就行?

发表于 2021-08-14 | 更新于: 2022-04-14 | 分类于 订阅号留言板 |
最近有很多朋友在问这个问题,那我就写篇短文集中回答一下,七夕我都不过了,有问题随时私聊我,捂脸。 什么是公众号迁移?公众号不支持直接变更主体。公众平台推出帐号迁移功能,通过此功能可将A账号的粉丝、文章素材(可选)、微信号(可选)、违规记录迁移至B帐号。 有人之前问,我的公众号是个人类型的号,可不可以升级为企业类型的号,所以答案是不可以直接升级,但可以通过迁移来改变你的主体。 具体做法是,先注册一个企业类型的订阅号,再将你之前的个人订阅号迁移过来,之后你使用企业号发文就好了,之前个人号上的文章和粉丝都可以迁移过来,间接的升级了你的个人号为企业号。 为了表述方便,这里的企业号指的是企业类型订阅号,下同。 迁移开留言有什么条件吗?有条件,条件就是公众号迁移的条件。 1)原公众号A必须是验证过主体信息的订阅号或服务号:组织类完成小额打款验证或认证成功(包括资质审核成功);个人类注册成功。2)目标账户B必须是验证过主体信息【小额打款验证或认证成功(包括资质审核成功)】的组织类订阅号或服务号。 看起来有点晕乎乎的,其实就是迁移的目标账号不能是个人类型的账号,可以是企业类型或者其他组织类型的账号,包 ...
阅读全文 »

2021公众号留言功能开通说明与小程序试用

发表于 2021-08-07 | 更新于: 2022-04-14 | 分类于 订阅号留言板 |
简简单单说两个事。 公众号留言功能开通说明现在是2021年了,留言功能还是很多公号作者的一大难题,没有留言功能,自己写的文章感觉得不到半点的反馈,也不知道有没有赞赏或者批评,非常难受,导致本来就是写写文章看看的小伙伴更加难以坚持下去了。 其实从2018年3月份开始,官方就关闭了对于新开的微信个人公众号的留言功能,原因其实也简单,由于微信体量越来越大,所以在监管这一块就需要担起更大的责任了,上面也会给他们更大的压力,这个大家应该都能理解。 我前面文章也说过了,目前来看,对于个人号来说,想要再开通微信留言功能的办法只有一个。 就是自己办理个体工商户,注册一个企业类型订阅号(注意不需要是服务号),然后将之前自己的个人号上面的粉丝和文章迁移到你新注册的这个企业号上,这个时候你的个人号就变成企业号了。 很多小伙伴都会问,怎么把个人号升级为企业号,就是上面说的这个方法,也就是说没有办法直接升级个人号到企业号,只有通过迁移这条路,迁移完后粉丝也不会怎么掉的,这个不用担心。 到了企业号后,再开通留言功能就方便一些了,当然也不是很简单,需要找一个有留言功能的订阅号,个人号就行,然后实行第二次迁移,将这个 ...
阅读全文 »

常用数据结构

发表于 2021-08-01 | 更新于: 2023-03-07 |
队列循环队列,固定容器大小,实现如下。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#include <iostream>using namespace std;const int MAX_QUEUE_SIZE = 102;template<typename T>class Node {public: T data; Node<T>* next;};template<typename T>class CircularQueue {public: CircularQueue(): front(NULL), rear(NULL), size(0) {} ...
阅读全文 »

protobuf通信协议

发表于 2021-07-28 | 更新于: 2023-03-01 |
包完整性 以特殊符号来分界,如每个包都以特定的字符来结尾(如\r\n,http的header就是),当在字节流中读取到该字符时,则表明上一个包到此为止。 固定包头+包体结构,包头一般时一个固定字节长度的结构,并且包头中会有一个特定的字段指定包体的大小。收包时,先接收固定字节数的头部,解出这个包的完整长度,按此长度接收包体。header+body 目前应用最多的一种包格式。 在序列化后的buffer前面增加一个字符流的头部,其中有一个字段存储包总长度,根据特殊字符(比如\n或者\0)判断头部的完整性。这样通常比2麻烦些,http和redis($6\r\nfoobar\r\n)采用的这种形式,收包的时候,先判断已经收到的数据中是否包含结束符,收到结束符后解析包头,解出这个包完整长度,按此长度接收包体。 协议设计序列号:tcp只能保证数据到达,不能保证数据是否处理。type表示协议类型,如xml,json。版本号尽量放在前面,读取版本号的时候可以少读一些字节,如下nginx。protobuf封装后是放在body里面的。header也是定长的,就不用序列化。body做序列化即可。http请求 ...
阅读全文 »

grpc框架

发表于 2021-06-25 | 更新于: 2023-03-19 |
采用proto buffer作为idl语言。采用http2进行通信,body采用protobuf序列化后的二进制传输,将字段名去掉,以数字代替。四种模式:一个端口可以对应多个service123456789101112131415161718192021222324252627282930313233343536syntax = "proto3";package helloworld; // 命名空间option go_package = "grpc/helloworld/proto";import "google/protobuf/timestamp.proto";import "google/protobuf/any.proto"; // go 里面的interface类型service Greeter {// simple rpcrpc GetFeature(Point) returns (Feature) {}// server-to-client streaming ...
阅读全文 »

redis配置与开发

发表于 2021-06-20 | 更新于: 2023-05-05 |
docker123docker run -itd --name redis -p 6379:6379 --restart unless-stopped redisdocker exec -ti redis bashredis-cli redis内存数据库、kv数据库、数据结构数据库对象类型有哪些?底层使用了哪些数据结构 string int,字符串长度小于等于20且能转成整数,set teacher 1000000,type teacher,object encoding teacher raw,字符串长度大于44 embstr,字符串长度小于等于44,cpu缓存中基本单位为cacheline 64字节,sdshdr头为9字节,加上’\0’,buf的最大长度为44,set teacher 1000000a,object encoding teacher list quicklist,双向循环链表 ziplist,压缩链表 hash,hmset role:1001 age 30 name mark sex 1, hgetall role:1001, hget role:1001 ...
阅读全文 »

周末随想

发表于 2021-06-05 | 更新于: 2022-04-14 | 分类于 感悟 |
这是一篇加密文章,内容可能是个人情感宣泄或者收费技术。如果你确实想看,请与我联系。
阅读全文 »

leetcode-单调栈题型

发表于 2021-06-05 | 更新于: 2023-03-07 |
单调栈分为单调递增栈和单调递减栈 单调递增栈即栈内元素保持单调递增的栈 同理单调递减栈即栈内元素保持单调递减的栈操作规则(下面都以单调递增栈为例) 如果新的元素比栈顶元素大,就入栈 如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小柱状图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。123456789stack<int> st;for(int i = 0; i < nums.size(); i++){ while(!st.empty() && st.top() > nums[i]) { st.pop(); } st.push(nums[i]);} 对于一个高度,如果能得到向左和向右的边界那么就能对每个高度求一次面积遍历所有高度,即可得出最大面积使用单调栈,在出栈操作时得到前后边界并计算面积 1234567891011121314151617181920int largestRectang ...
阅读全文 »

搞懂递归

发表于 2021-04-04 | 更新于: 2023-03-07 |
什么是递归周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办? 别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪一排,于是你就知道答案了。 这就是一个非常标准的递归求解问题的分解过程,去的过程叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。刚刚这个生活中的例子,我们用递推公式将它表示出来就是这样的:1f(n)=f(n-1)+1 其中,f(1)=1 f(n) 表示你想知道自己在哪一排,f(n-1) 表示前面一排所在的排数,f(1)=1 表示第一排的人知道自己在第一排。有了这个递推公式,我们就可以很轻松地将它改为递归代码,如下:1234int f(int n) { if (n == 1) return 1; return f(n-1) + ...
阅读全文 »
1…91011…18
nephen

nephen

173 日志
16 分类
64 标签
GitHub E-Mail
友情链接
  • 新建留言板
  • 订阅号留言板(旧)
  • 订阅号留言板(新)
  • 山楂岛秘密花园
  • 代发短信
© 2016 — 2024 nephen
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备2022125614号-1
本站访客数 人次 本站总访问量 次