我写的观察者模式, 大家帮忙看看,如何?
我写的观察者模式, 大家帮忙看看,如何?
有可以改进的地方吗?
请斧正
#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;
}
}
就是不够简洁,读起来不能朗朗上口
[解决办法]
写的挺好的吧,除去楼上说的这些,只有两个小建议。
(1) 要是我的话,我会把 Observer::Update 改成接收 Subject* 或 Server* 参数的,这样 Observer 内部就不用自己储存相关的 Subject 了,修改 Observer/Subject 关系的时候也只需改一头就行了。
(2) Server::AddObserver 的时候没有判重,因此一个 Observer 能够增加很多次。 Server::DeleteObserver 假设序列中至多只能够有一个匹配的 Observer 指针,这点没有保证,因为 Add 的时候没有判重。你是希望这样的行为呢,还是不希望呢。
[解决办法]
为什么数据要返回给观察者? 直接读取数据不就好了吗?数据在内存里面,访问和更新的时候加把锁就行了。