定義對象間的一種一對多的依賴關系,當一個對象的狀態發生變化時,所有依賴于它的對象都得到通知并被自動更新
UML圖:
適用
當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這兩者封裝在獨立的對象中以使他們可以各自獨立地改變和復用
當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象待改變
當一個對象必須通知其他對象,而他又不能假定其他對象是誰。換言之,你不希望這些對象是緊密耦合的
//test.h
#include <list>
typedef int STATE;
using namespace std;
/**///////////////////////////////////////////////////////////////////////////
class Observer;
class Subject

{
public:
Subject() : m_nSubjectState(-1)
{}
virtual ~Subject();
void Notify(); //通知對象改變狀態
void Attach(Observer *pObserver); //新增對象
void Detach(Observer *pObserver); //刪除對象
virtual void Setstate(STATE nState);
virtual STATE Getstate();
protected:
STATE m_nSubjectState;
list<Observer*> m_listObserver;
};
//被更新的類
class Observer

{
public:
Observer() : m_nObserverState(-1)
{}
virtual ~Observer()
{}
virtual void Update(Subject* pSubject) = 0; //更新狀態
protected:
STATE m_nObserverState;
};
class ConCreateSubject : public Subject

{
public:
ConCreateSubject() : Subject()
{}
virtual ~ConCreateSubject()
{}
virtual void SetState(STATE nState);
virtual STATE GetState();
};
class ConCreateObserver : public Observer

{
public:
ConCreateObserver() : Observer()
{}
virtual ~ConCreateObserver()
{}
virtual void Update(Subject* pSubject);
};
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include "test.h"
using namespace std;
/**///////////////////////////////////////////////////////////////////////////
void Subject::Attach(Observer *pObserver)

{
cout << "Attach an Observer\n";
m_listObserver.push_back(pObserver);
}
void Subject::Detach(Observer *pObserver)

{
list<Observer*>::iterator iter;
iter = find(m_listObserver.begin(),m_listObserver.end(),pObserver);
if (m_listObserver.end() != iter)
{
m_listObserver.erase(iter);
}
cout << "Detach an ObServer\n";
}
void Subject::Notify()

{
cout << "Notify Observer's state\n";
list<Observer*>::iterator iter1,iter2;
for (iter1 = m_listObserver.begin(),iter2 = m_listObserver.end(); iter1 != iter2; ++iter1)
{
(*iter1)->Update(this); //更新鏈表中所有對象的狀態
}
}
void Subject::Setstate(STATE nState)

{
cout << "SetState by Subject \n";
m_nSubjectState = nState;
}
STATE Subject::Getstate()

{
cout << "Getstate by Subject\n";
return m_nSubjectState;
}
Subject::~Subject()

{
list<Observer*>::iterator iter1,iter2,temp;
for (iter1 = m_listObserver.begin(),iter2 = m_listObserver.end(); iter1 != iter2;)
{
temp = iter1;
++iter1;
delete (*temp);
}
m_listObserver.clear();
}
void ConCreateSubject::SetState(STATE nState)

{
cout << "Setstate by ConCreateSubject\n";
m_nSubjectState = nState;
}
STATE ConCreateSubject::GetState()

{
cout << "Getstate by ConCreateSubject\n";
return m_nSubjectState;
}
void ConCreateObserver::Update(Subject* pSubject)

{
if (NULL == pSubject)
{
return;
}
m_nObserverState = pSubject->Getstate();
cout << "The ObserverState is" << m_nObserverState<< endl;
}
/**///////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])

{
Observer *p1 = new ConCreateObserver;
Observer *p2 = new ConCreateObserver;
Subject *p = new ConCreateSubject;
p->Attach(p1);
p->Attach(p2);
p->Setstate(4);
p->Notify();
p->Detach(p1);
p->Setstate(10);
p->Notify();
delete p;
system("pause");
return 0;
}


