用事件实现中介者模式
前言
中介者模式,顾名思义.就像我们上学时候都有过传纸条的经历,因为太远,所以需要有一个中间者进行传递.
剧情假设是这样的.小主Q喜欢小Y好久了,一直没敢表白,一直在煎熬中,终于写了一封情书,但由于小主Q脸皮薄,怕被小Y拒绝.于是找来小W进行.
流程
- 小主Q写好情书,交给小W
- 小W将情书,交给小Y
- 小Y进行回复,然后交给小W
- 小W将小Y的回复交给小主Q
用图代表
实现代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
HANDLE events[4]; //声明一个存放事件句柄的集合
HANDLE threads[3]; //声明一个线程句柄的集合
char str[128] = { 0 }; //声明一个char数组存,相当于纸条
DWORD xiaoQ(void *p)
{
int i = 1;
memset(str, '\0', 128);
sprintf(str, "小Q第%d次说: i love you 小Y", i);
Sleep(1000);
SetEvent(events[0]);
while (++i)
{
WaitForSingleObject(events[3], INFINITE); //无限等待一个信号
memset(str, '\0', 128);
sprintf(str, "小Q第%d次说: i love you 小Y", i);
Sleep(2000);
SetEvent(events[0]);
}
return 0;
}
DWORD xiaoW(void *p)
{
int flag = 0; //判断等待事件信号
int i = 0;
while (++i)
{
if (flag == 0) //等待和发送来自小Q的消息
{
WaitForSingleObject(events[0], INFINITE);
printf("小W传递%d次:%s\n", i, str);
Sleep(1000);
SetEvent(events[1]);
flag = 1;
}
else //等待和发送来自小Y的小
{
WaitForSingleObject(events[2], INFINITE);
printf("小W传递%d次:%s\n", i, str);
Sleep(1000);
SetEvent(events[3]);
flag = 0;
}
}
return 0;
}
DWORD xiaoY(void *p)
{
int i = 0;
while (++i)
{
WaitForSingleObject(events[1], INFINITE); //无限等待一个信号
memset(str, '\0', 128);
sprintf(str, "小Y第%d次说: i love you to,小Q", i);
Sleep(2000);
SetEvent(events[2]);
}
return 0;
}
int main(int argc, char *argv[])
{
//初始化事件
events[0] = CreateEvent(NULL, FALSE, FALSE, NULL); //参数2代表是否复位 TURE手动 FALSE自动 参数3代表信号状态
events[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
events[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
events[3] = CreateEvent(NULL, FALSE, FALSE, NULL);
//初始化线程
threads[0] = CreateThread(NULL, 0, xiaoQ, NULL, 0, NULL);
threads[1] = CreateThread(NULL, 0, xiaoW, NULL, 0, NULL);
threads[2] = CreateThread(NULL, 0, xiaoY, NULL, 0, NULL);
WaitForMultipleObjects(3, threads, TRUE, INFINITE);
system("pause");
return 0;
}
秋风
2016-07-03