用事件实现中介者模式

前言

  中介者模式,顾名思义.就像我们上学时候都有过传纸条的经历,因为太远,所以需要有一个中间者进行传递.

  剧情假设是这样的.小主Q喜欢小Y好久了,一直没敢表白,一直在煎熬中,终于写了一封情书,但由于小主Q脸皮薄,怕被小Y拒绝.于是找来小W进行.

流程

  1. 小主Q写好情书,交给小W
  2. 小W将情书,交给小Y
  3. 小Y进行回复,然后交给小W
  4. 小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