——————- 抽象事件 | 具体事件 ——————–
—————– 抽象观察者 | 具体观察者 ——————
逻辑
Base_Event.h
#ifndef SUBJECT_H
#define SUBJECT_H
class Base_Observer;
class Base_Event
{
public:
virtual void Add_Observer_Into_Container(Base_Observer *) = 0;
virtual void Delete_Observer_From_Container(Base_Observer *) = 0;
virtual void Event_Appear() = 0;
protected:
private:
};
#endif
Concrete_Event.h
#ifndef CONCRETE_SUBJECT_H
#define CONCRETE_SUBJECT_H
#include "Base_Event.h"
#include "Base_Observer.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Concrete_Event : public Base_Event
{
public:
Concrete_Event(){
this->event_name = "";
}
void Event_Type(string event){
this->event_name = event;
cout << event_name << endl;
}
void Add_Observer_Into_Container(Base_Observer* observer){
observer_container.push_back(observer);
}
void Delete_Observer_From_Container(Base_Observer* observer){
observer_container.remove(observer);
}
void Event_Appear(){
list<Base_Observer* >::iterator it = observer_container.begin();
while (it != observer_container.end()){
(*it)->Observer_Action(this->event_name);
++it;
}
}
protected:
private:
list<Base_Observer* > observer_container;
string event_name;
};
#endif
Base_Observer.h
#ifndef OBSERVER_H
#define OBSERVER_H
#include <iostream>
using namespace std;
class Base_Observer
{
public:
virtual void Observer_Action(string) = 0;
protected:
private:
};
#endif
Concrete_Observer.h
#ifndef CONCRETE_OBSERVER_H
#define CONCRETE_OBSERVER_H
#include "Base_Observer.h"
#include <iostream>
#include <string>
using namespace std;
class Concrete_Observer1 : public Base_Observer
{
public:
Concrete_Observer1(string name) :observer_name(name) {}
void Observer_Action(string event){
cout << observer_name << " say : i see " << event << endl;
}
protected:
private:
string observer_name;
};
class Concrete_Observer2 : public Base_Observer
{
public:
Concrete_Observer2(string name) :observer_name(name) {}
void Observer_Action(string event){
cout << observer_name << " say :i see " << event << endl;
}
protected:
private:
string observer_name;
};
#endif
main.cpp
#include "Concrete_Event.h"
#include "Concrete_Observer.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
Concrete_Event* Concrete_Event_Index = new Concrete_Event;
Base_Observer* people_1_index = new Concrete_Observer1("man");
Base_Observer* people_2_index = new Concrete_Observer2("women");
Concrete_Event_Index->Add_Observer_Into_Container(people_1_index);
Concrete_Event_Index->Add_Observer_Into_Container(people_2_index);
Concrete_Event_Index->Event_Type("a Dog");
Concrete_Event_Index->Event_Appear();
Concrete_Event_Index->Delete_Observer_From_Container(people_2_index);
Concrete_Event_Index->Event_Type("a Cat ");
Concrete_Event_Index->Event_Appear();
SAFE_DELETE(people_1_index);
SAFE_DELETE(people_2_index);
SAFE_DELETE(Concrete_Event_Index);
getchar();
return 0;
}
运行结果