C++ 简单的观察者模式

#include <iostream>
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值