首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟我写的观察者模式, 大家帮忙看看,怎么

2013-05-02 
我写的观察者模式, 大家帮忙看看,如何?我写的观察者模式, 大家帮忙看看,如何?有可以改进的地方吗?请斧正#i

我写的观察者模式, 大家帮忙看看,如何?
我写的观察者模式, 大家帮忙看看,如何?

有可以改进的地方吗?

请斧正




#include <vector>
#include<assert.h>

class Observer;

class Subject
{
public:
virtual void AddObserver(Observer* pob)=0;
virtual void DeteleObserver(Observer* pob)=0;
virtual void Notify() const=0;
};


class Observer
{
private:
Subject* m_psub;
public:
void SetSubject(Subject* pob)
{
assert(pob);
m_psub=pob;
}
Subject* GetSubject() const
{
return m_psub;
}
virtual void Update()=0;
};


class Server:public Subject
{
private:
std::vector<Observer*> m_vecObserver;
int m_nData;


public:
Server():m_nData(0){}

void AddObserver(Observer* pob)
{
assert(pob);
m_vecObserver.push_back(pob);
pob->SetSubject(static_cast<Subject*>(this));//save subject
}
void DeteleObserver(Observer* pob)
{
assert(pob);
std::vector<Observer*>::const_iterator iter=m_vecObserver.begin();
while( (iter!=m_vecObserver.end()) && (*iter!=pob) )
{
++iter;
}
if(iter!=m_vecObserver.begin())
{
m_vecObserver.erase(iter);
}
}

void Notify() const
{
std::vector<Observer*>::const_iterator iter=m_vecObserver.begin();
while( iter!=m_vecObserver.end() )
{
(*iter)->Update();
++iter;
}
}
void SetData(int nData)
{
m_nData=nData;
Notify();
}

int GetData() const
{
return m_nData;
}

};


class Client:public Observer
{
private:
int m_nData;
public:
Client(int nData=0):m_nData(nData){}

void Update( )
{
Subject* psub=GetSubject();
assert(psub);
Server* pSer=dynamic_cast<Server*>(psub);
assert(pSer);
m_nData=pSer->GetData();
}
void PrintRecentStatus() const
{
if(GetSubject())
printf("被观察者的最新数据为:%d\r\n",m_nData);
else
printf("没有被观察者\r\n");
}
};

int main()
{
Server ser;
Client c1(10),c2(20);
c1.PrintRecentStatus();
c2.PrintRecentStatus();

ser.AddObserver(&c1);
ser.AddObserver(&c2);

ser.SetData(200);


c1.PrintRecentStatus();
c2.PrintRecentStatus();



return 0;

}
}

[解决办法]
std::vector<Observer*> m_vecObserver;
应该改成std::map<Observer*,Observer*> m_vecObserver;
这样你在
void DeteleObserver(Observer* pob)    {}
就不需要遍历了,根据pob指会查找到删除就可以了。
[解决办法]
引用:
我眼中的观察者是这样的, 一坨数据有N个人关心,那么N个人就是N个观察者, 这一坨数据发生改变的时候我都会调用Notify通知所有观察者做自己的更新。

而楼主眼中的观察者是每个观察者都有各自的数据, 现在我一个人要观察很多坨数据

---代码一开始看起来还行, 看到
C/C++ code?12345678 void Update( )    {        ……


好吧, 我承认我粗心了, 楼主的代码木有问题


就是不够简洁,读起来不能朗朗上口
[解决办法]
写的挺好的吧,除去楼上说的这些,只有两个小建议。

(1) 要是我的话,我会把 Observer::Update 改成接收 Subject* 或 Server* 参数的,这样 Observer 内部就不用自己储存相关的 Subject 了,修改 Observer/Subject 关系的时候也只需改一头就行了。

(2) Server::AddObserver 的时候没有判重,因此一个 Observer 能够增加很多次。 Server::DeleteObserver 假设序列中至多只能够有一个匹配的 Observer 指针,这点没有保证,因为 Add 的时候没有判重。你是希望这样的行为呢,还是不希望呢。
[解决办法]
为什么数据要返回给观察者? 直接读取数据不就好了吗?数据在内存里面,访问和更新的时候加把锁就行了。

热点排行
Bad Request.