---------------------------------------------
-- 时间:2019-03-22
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------
一、解释
1、结构:分为目标和观察者。
2、功能:当目标更新时,该模式可以将该更新内容发布给所有的该目标的观察者。
3、实际上,目标通过抽象类得到观察者的接口,然后在其内建立观察者的链表,当发布时直接按照同一个接口(面向接口编程)向所有的观察者的更新。
二、代码
#include <iostream>
#include <list>
using namespace std;
// 观察者……抽象类
class Observe
{
public:
virtual void Update(int i) = 0;
virtual void Attach() = 0;
virtual void Detach() = 0;
};
// 目标……抽象类
class Subject
{
public:
virtual void Attach(Observe *p) = 0;
virtual void Detach(Observe *p) = 0;
virtual void Notify() = 0;
};
// 建立3个观察者、1个目标
class Observe_1 : public Observe
{
public:
Observe_1(Subject *p)
{
m_pSubject = p;
}
public:
void Attach()
{
m_pSubject->Attach(this);
}
void Detach()
{
m_pSubject->Detach(this);
}
void Update(int i)
{
cout<<"I am observe 1,showing "<< i <<endl;
}
private:
Subject *m_pSubject;
};
class Observe_2 : public Observe
{
public:
Observe_2(Subject *p)
{
m_pSubject = p;
}
public:
void Attach()
{
m_pSubject->Attach(this);
}
void Detach()
{
m_pSubject->Detach(this);
}
void Update(int i)
{
cout<<"I am observe 2,showing "<< i <<endl;
}
private:
Subject *m_pSubject;
};
class Observe_3 : public Observe
{
public:
Observe_3(Subject *p)
{
m_pSubject = p;
}
public:
void Attach()
{
m_pSubject->Attach(this);
}
void Detach()
{
m_pSubject->Detach(this);
}
void Update(int i)
{
cout<<"I am observe 3,showing "<< i <<endl;
}
private:
Subject *m_pSubject;
};
class Subject_All : public Subject
{
public:
void Attach(Observe *p)
{
pObserverList.push_back(p);
}
void Detach(Observe *p)
{
pObserverList.remove(p);
}
void Notify()
{
list<Observe *>::iterator it = pObserverList.begin();
for (;it!=pObserverList.end();++it)
{
(*it)->Update(iState_All);
}
}
void SetState(int iState)
{
iState_All = iState;
}
private:
list<Observe *> pObserverList;
int iState_All;
};
int main()
{
// Create Subject
Subject_All *pSubject = new Subject_All();
// Create Observer
Observe_1 *pObserver1 = new Observe_1(pSubject);
Observe_2 *pObserver2 = new Observe_2(pSubject);
Observe_3 *pObserver3 = new Observe_3(pSubject);
// Change the state
pSubject->SetState(2);
// Register the observer
pObserver1->Attach();
pObserver2->Attach();
pObserver3->Attach();
pSubject->Notify();
// Unregister the observer
pObserver3->Detach();
pSubject->SetState(3);
pSubject->Notify();
delete pObserver1;
delete pObserver2;
delete pObserver3;
delete pSubject;
cin.get();
}
结果:
(SAW:Game Over!)