小编Jer*_*ian的帖子

发布者 - 订阅者与观察者

我试图将Observer设计模式理解为主要事件调度设计模式.观察者模式似乎是发布 - 订阅设计模式的类型或类型,我想知道为什么有两个相似的外观设计模式以及我应该如何在两者之间进行选择.

在这两种情况下,信息消息都在实体之间发送,在这两种情况下,实体必须以某种方式注册或订阅才能接收消息.

两种设计模式之间的主要区别似乎是:

  • 观察者模式似乎具有较低的消息量.观察员向他们观察的实体注册,以获得某一事件的通知.发布 - 订阅模式似乎涉及单向对话,一种从一个实体到另一个实体的独白,具有更多不同类型的消息.
  • 在Observer模式中,Observers期望一种特定类型的事件通知,其中Publish-Subscribe似乎具有更开放的消息协议,具有更广泛的可能消息类型和消息内容(由特定类型的事件触发的消息之间的差异)指示事件发生与更一般的消息协议相对应,消息包含可能不是事件触发器的信息,例如包含由周期性定时器触发的温度数据的消息.
  • Observer在应用程序的边界内或在单个进程内实现.Publish-Subscribe是一种跨应用程序通信模式,消息在不同进程之间交换.
  • 架构的不同之处在于,当Observer使用组合的发布者/代理和订阅者(​​观察者)实体时,Publish-Subscribe具有单独的发布者,代理和订阅者实体.

我想到的一个想法是,在多线程应用程序中,可以在多个线程之间进行通信而不是Observer模式时使用Publish-Subscribe模式.也许Obse​​rver模式可以在进程之间使用,例如进程注册与另一个进程注册,以便在事件发生时得到通知.一个示例是农场管理仪表板应用程序,其注册多个动物饲料箱,如果由箱测量的饲料水平或重量下降到某个阈值以下则通知.

这两种设计模式之间是否存在其他重要差异,这些设计模式可以为选择一种模式提供标准?

design-patterns publish-subscribe event-dispatching observer-pattern

44
推荐指数
0
解决办法
1万
查看次数

用于字符串连接的snprintf

我使用snprintf将字符串连接到char数组:

char buf[20] = "";
snprintf(buf, sizeof buf, "%s%s", buf, "foo");
printf("%s\n", buf);
snprintf(buf, sizeof buf, "%s%s", buf, " bar");
printf("%s\n", buf);
Run Code Online (Sandbox Code Playgroud)

问题是第二次连接buf而不是添加"bar",替换"foo"它.输出如下:

foo
bar
Run Code Online (Sandbox Code Playgroud)

第一个%s应该保留buf(在这种情况下保持"foo").第二个%s应该附加"bar"它.对?

我究竟做错了什么?

c string

19
推荐指数
2
解决办法
3万
查看次数

针对rabbitmq-c构建

我试图在c中连接到rabbitmq并且每次都失败了.我就是这样做的.

下载rabbitmq-c
安装it(make && make install)只是为了确保满足依赖性.
修改后的连接变量amqp_sendstring.c
使用make,运行./amqp_sendstring和工作
然后我开始创建自己的文件并通过gcc编译它们使用:

gcc -lrabbitmq -o j_test test.c
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,它无法与librabbitmq链接以下错误:

/tmp/cc63IlXq.o: In function `main':
test.c:(.text+0xa): undefined reference to `amqp_new_connection'
test.c:(.text+0x1a): undefined reference to `amqp_destroy_connection'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我从ampq_*开始删除了所有内容.瞧!它成功建成.这对我来说是gcc能够找到头而不是lib的指示器.

这是test.c源代码:

#include <amqp.h>
#include <amqp_framing.h>
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人请指出我正确的方向吗?

编辑:我忘了提到我在ubuntu盒子(12.04).认为它隐含在上述陈述中.

c rabbitmq

7
推荐指数
1
解决办法
5956
查看次数