先上代码,
Observers.h
#pragma once
#include <iostream>
#include <list>
#include <string>
class Subject;
class Observer
{
public:
Observer(Subject* _sub, std::string _str, bool AutoConnect = true);
~Observer();
void OnUpdate();
protected:
virtual void Connect();
virtual void DisConnect();
private:
Subject* sub;
std::string obStr;
};
class Subject
{
public:
Subject(std::string str);
virtual void Add(Observer* ob);
virtual void Delete(Observer* ob);
void OnUpdate();
std::string getName();
protected:
private:
std::list<Observer*> obList;
std::string strName;
};
void Observers_Test();
Observers.cpp
#include "stdafx.h"
#include "Observers.h"
void Observer::OnUpdate()
{
std::cout<<"this is ="<<this<<" "<<obStr<<"..."<<sub->getName()<<"\n";
}
Observer::Observer(Subject* _sub, std::string _str, bool AutoConnect /*= true*/) :sub(_sub),obStr(_str)
{
if (AutoConnect)
{
Connect();
}
}
void Observer::DisConnect()
{
sub->Delete(this);
}
void Observer::Connect()
{
sub->Add(this);
}
Observer::~Observer()
{
DisConnect();
}
void Subject::OnUpdate()
{
if (! obList.empty())
{
std::list<Observer*>::const_iterator itOb = obList.begin();
for (; itOb != obList.end(); itOb++)
{
(*itOb)->OnUpdate();
}
}
}
void Subject::Delete(Observer* ob)
{
if (ob)
{
obList.remove(ob);
}
}
void Subject::Add(Observer* ob)
{
if (ob)
{
obList.push_front(ob);
}
}
Subject::Subject(std::string str) :strName(str)
{
}
std::string Subject::getName()
{
return strName;
}
void Observers_Test()
{
Subject* sub = new Subject("师傅被妖怪抓走了");
Observer* ob1 = new Observer(sub, "孙悟空");
Observer* ob2 = new Observer(sub, "猪八戒");
Observer* ob3 = new Observer(sub, "沙和尚");
// sub->Add(ob1);
// sub->Add(ob2);
// sub->Add(ob3);
sub->OnUpdate();
system("pause");
}