using namespace std;
#define MAX_NUM 5
class CObserve
{
public:
CObserve(){}
virtual void DoSomeThing()=0;
/*template<typename X,typename Y>
void RegisterFunction()
{
}*/
};
class CObserveObject
{
public:
CObserveObject()
{
m_num = 0;
}
~CObserveObject()
{
}
bool Add(const CObserve& m)
{
if(m_num < MAX_NUM)
{
m_pArray[m_num++] = const_cast<CObserve *>(&m);
return true;
}
return false;
}
void SendEvent(){
for(int i = 0; i < m_num ; ++i)
{
m_pArray[i]->DoSomeThing();
}
}
CObserve * m_pArray[MAX_NUM];
int m_num;
};
class PPP : public CObserve
{
public:
void DoSomeThing()
{
cout<<"你观察的PPPObject有动作"<<endl;
}
};
class CCC : public CObserve
{
public:
void DoSomeThing()
{
cout<<"你观察的CCCObject有动作"<<endl;
}
};
class XXX : public CObserveObject
{
public:
void TouPao()
{
cout<<"偷跑"<<endl;
}
};
class BBB : public CObserveObject
{
public:
void Pao()
{
cout<<"跑了"<<endl;
}
};
template<typename X,typename Y>
void DoFunctionAndSendEvent(X * a,Y x)
{
(a->*x)();
a->SendEvent();
}
int main()
{
//观察者
PPP ppp;
CCC ccc;
//被观察的
XXX xxx;
BBB bbb;
//添加观察者
xxx.Add(ppp);
bbb.Add(ppp);
//添加观察者
xxx.Add(ccc);
bbb.Add(ccc);
DoFunctionAndSendEvent(&xxx, &XXX::TouPao);
DoFunctionAndSendEvent(&bbb, &BBB::Pao);
getchar();
return 0;
}
//
#include<list>
#include<string>
class Observer
{
public:
Observer(){}
virtual ~Observer(){}
virtual void Update()=0;
};
class Blog
{
public:
Blog(){}
virtual~Blog(){}
void Attach(Observer *observer){ m_observers.push_back(observer); }
void Remove(Observer *observer){ m_observers.remove(observer); }
void Notify()
{
for(std::list<Observer *>::iterator iter = m_observers.begin();
iter != m_observers.end();
++iter
)
{
(*iter)->Update();
}
}
virtual void SetStatus(std::string m){ m_status = m; }
virtual std::string GetStatus(){ return m_status; }
private:
std::list<Observer *> m_observers;
protected:
std::string m_status;
};
#include <iostream>
#include "head.h"
using namespace std;
class Blog优快云 : public Blog
{
private:
string m_name;
public:
Blog优快云(string name):m_name(name){}
~Blog优快云(){}
};
class ObserverBlog : public Observer
{
private:
string m_name; //观察者名称
Blog *m_blog; //观察的博客,当然以链表形式更好,就可以观察多个博客
public:
ObserverBlog(string name,Blog *blog): m_name(name), m_blog(blog) {}
~ObserverBlog() {}
void Update() //获得更新状态
{
string status = m_blog->GetStatus();
cout<<m_name<<"-------"<<status<<endl;
}
};
int main()
{
Blog *blog = new Blog优快云("wuzhekai1985");
Observer *observer1 = new ObserverBlog("tutupig", blog);
blog->Attach(observer1);
blog->SetStatus("发表设计模式C++实现(15)——观察者模式");
blog->Notify();
delete blog;
delete observer1;
getchar();
return 0;
}