| 網(wǎng)站首頁 | 關(guān)于我們 | 開發(fā)優(yōu)勢 | 產(chǎn)品展示 |
| 合作企業(yè) | 新聞動態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟南軟件開發(fā) 時間:2016年12月20日
觀察者模式
定義:
定義一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動更新。
實用性:
1、當(dāng)一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自地改變和復(fù)用。
2、當(dāng)一個對象改變時需要同時改變其它對象,而不知道具體有多少對象有待改變。
3、當(dāng)一個對象必須通知其他對象,而它又不能假定其它對象是誰。也就是說,不希望這些對象是緊密耦合的。
優(yōu)點:
1、 目標(biāo)和觀察這間抽象耦合。
2、 支持廣播通信
缺點:
可能出現(xiàn)意外更新。
實現(xiàn):
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<<"接收到信息:";< p="" style="margin: 0px; padding: 0px;">
cout<
}
private:
string m_name;
};
Observer *pObserver1 = new ConcreteObserver("觀察者1");
Observer *pObserver2 = new ConcreteObserver("觀察者2");
Observer *pObserver3 = new ConcreteObserver("觀察者3");
Subject *pSubject1 = new ConcreteSubject("目標(biāo)對象1");
Subject *pSubject2 = new ConcreteSubject("目標(biāo)對象2");
pSubject1->Attack(pObserver1);
pSubject1->Attack(pObserver2);
pSubject1->Attack(pObserver3);
pSubject2->Attack(pObserver2);
pSubject2->Attack(pObserver3);
pSubject1->SetState("工作中。。。");
pSubject2->SetState("休息中。。。");
pSubject1->Notify();
pSubject2->Notify();
pSubject2->SetState("工作中。。。");
pSubject1->SetState("休息中。。。");
pSubject1->Notify();
pSubject2->Notify();
想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。