(1) 定义消息
#pragma once
enum
{
SHOW_VIDOE = 2,
SHOW_AUIDO = 3,
};
#pragma once
#include<list>
class Listener
{
public:
Listener(){};
~Listener(){};
virtual void update(const int &mask, const void *message) = 0;
};
class Subject
{
public:
Subject()
{
}
~ Subject()
{
}
void addNotifyListener(Listener *listener)
{
if(listener != nullptr)
{
m_Listeners.push_back(listener);
}
}
void removeListener(Listener *listener)
{
if(listener != nullptr)
{
m_Listeners.remove(listener);
}
}
void clearListener()
{
LISTENERLIST::iterator it = m_Listeners.begin();
LISTENERLIST::iterator end = m_Listeners.end();
while (it!= end)
{
Listener* l = *it;
delete l;
l = nullptr;
it++;
}
m_Listeners.clear();
}
void notify(const int &mask, const void *message = nullptr)
{
LISTENERLIST::iterator it = m_Listeners.begin();
LISTENERLIST::iterator end = m_Listeners.end();
while (it!= end)
{
(*it)->update(mask,message);
it++;
}
}
private:
typedef std::list<Listener *> LISTENERLIST;
LISTENERLIST m_Listeners;
};
(3) 接受消息的两个类()
//类A
#pragma once
#include"stdafx.h"<pre name="code" class="cpp">#pragma once
#include"stdafx.h"
#include"Messsage.h"
#include"Listener.h"
#include<iostream>
using namespace std;
class ClassB:public Listener
{
public:
ClassB()
{
}
void update(const int &mask, const void *message)
{
if(mask == SHOW_AUIDO)
{
cout<<"ClassB = SHOW_AUDIO"<<endl;
}
else if(mask == SHOW_VIDOE)
{
cout<<"ClassB = SHOW_Video"<<endl;
}
}
private:
};
//类B
#include"Messsage.h"
#include"Listener.h"
#include<iostream>
using namespace std;
class ClassA:public Listener
{
public:
ClassA()
{
}
void update(const int &mask, const void *message)
{
if(mask == SHOW_AUIDO)
{
cout<<"ClassA = SHOW_AUDIO"<<endl;
}
else if(mask == SHOW_VIDOE)
{
cout<<"ClassA = SHOW_Video"<<endl;
}
}
};
(4) 负责发消息的主类
#pragma once
#include"stdafx.h"
#include"Messsage.h"
#include"Listener.h"
#include"ClassA.hpp"
#include"ClassB.hpp"
#include<iostream>
class mainShow:public Subject
{
public:
mainShow()
{
m_ClassA = new ClassA();
m_ClassB = new ClassB();
this->addNotifyListener(m_ClassA);
this->addNotifyListener(m_ClassB);
}
~ mainShow()
{
}
void sendMes()
{
this->notify(SHOW_AUIDO);
this->notify(SHOW_VIDOE);
}
private:
ClassA *m_ClassA;
ClassB *m_ClassB;
};
(5) 测试函数
// ListenerProject.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"MainShow.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
mainShow m_show;
m_show.sendMes();
system("Pause");
return 0;
}
(6)运行结果: