?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
观察者模?/strong>
定义Q?/p>
定义一U一对多的依赖关p,当一个对象的状态发生改变时Q所有依赖于它的对象都得到通知q自动更新?/p>
实用性:
1、当一个抽象模型有两个斚wQ其中一个方面依赖于另一斚w。将q二者封装在独立的对象中以它们可以各自地改变和复用?/p>
2、当一个对象改变时需要同时改变其它对象,而不知道具体有多对象有待改变?/p>
3、当一个对象必通知其他对象Q而它又不能假定其它对象是谁。也是_不希望这些对象是紧密耦合的?/p>
优点Q?/p>
1?目标和观察这间抽象耦合?/p>
2?支持q播通信
~点Q?/p>
可能出现意外更新?/p>
实现Q?/span>
class Subject;
class Observer
{
public:
virtual~Observer() {}
virtual void Handle(Subject *pSubject) = 0;
};
class Subject
{
public:
virtual~Subject()
{
}
voidAttack(Observer *pObserver)
{
m_ObserverList.push_back(pObserver);
}
voidDetach(Observer *pObserver)
{
m_ObserverList.remove(pObserver);
}
voidNotify()
{
for (list
{
(*it)->Handle(this);
}
}
virtualstring GetName()
{
return "";
}
virtual void SetState(string state)
{
}
virtual stringGetState()
{
return "";
}
private:
list
};
class ConcreteSubject:public Subject
{
public:
ConcreteSubject(string name):m_name(name)
{
}
string GetState()
{
return m_state;
}
void SetState(string state)
{
m_state = state;
}
string GetName()
{
return m_name;
}
private:
string m_state;
string m_name;
};
class ConcreteObserver:public Observer
{
public:
ConcreteObserver(stringname):m_name(name)
{
}
voidHandle(Subject *pSubject)
{
cout<<m_name<<"接收C息:";< p="" style="margin: 0px; padding: 0px;">
cout<
}
private:
string m_name;
};
Observer *pObserver1 = new ConcreteObserver("观察?");
Observer *pObserver2 = new ConcreteObserver("观察?");
Observer *pObserver3 = new ConcreteObserver("观察?");
Subject *pSubject1 = new ConcreteSubject("目标对象1");
Subject *pSubject2 = new ConcreteSubject("目标对象2");
pSubject1->Attack(pObserver1);
pSubject1->Attack(pObserver2);
pSubject1->Attack(pObserver3);
pSubject2->Attack(pObserver2);
pSubject2->Attack(pObserver3);
pSubject1->SetState("工作中。。?quot;);
pSubject2->SetState("休息中。。?quot;);
pSubject1->Notify();
pSubject2->Notify();
pSubject2->SetState("工作中。。?quot;);
pSubject1->SetState("休息中。。?quot;);
pSubject1->Notify();
pSubject2->Notify();