觀察者模式
使用場景
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬於行爲型模式。
觀察者模式結構圖
在觀察者模式中有如下角色:
- Subject : 被觀察者
- Observer : 抽象觀察者
- BinaryObserver : 具體觀察者
觀察者模式簡單實現
抽象觀察者(Observer)
裏面定義了一個更新方法:
class Observer
{
public:
Observer();
virtual void update() = 0;
virtual ~Observer();
protected:
Subject *m_subject;
};
具體觀察者(BinaryObserver)
class Observer
{
public:
Observer();
virtual void update() = 0;
virtual ~Observer();
protected:
Subject *m_subject;
};
class OctalObserver : public Observer
{
public:
OctalObserver(Subject *subject);
void update();
};
class HexaObserver : public Observer
{
public:
HexaObserver(Subject *subject);
void update();
};
具體被觀察者(Subject)
class Subject
{
public:
Subject();
int getState() const;
void setState(const int& state);
void attach(Observer *observer);
void notifAllObservers();
private:
std::list<Observer* >m_observers;
int m_state;
};
主函數調用
int main()
{
Subject *subject = new Subject();
Observer *observer_1 = new HexaObserver(subject);
Observer *observer_2 = new OctalObserver(subject);
Observer *observer_3 = new BinaryObserver(subject);
cout << "First state change: 15" << endl;
subject->setState(15);
cout << endl << "Second state change: 10" << endl;
subject->setState(10);
delete observer_1;
delete observer_2;
delete observer_3;
return 0;
}
結果
First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010
模式解析
此模式首先創建一個被觀察者對象 subject ,然後將此對象傳入觀察者對象中 observer_1 、 observer_2 、 observer_3,然後被觀察者對象 subject 在設置值的時候將會調用函數 notifAllObservers(),notifAllObservers 函數內部通過循環遍歷分別通知 觀察者。
源代碼下載
ObserverPattern.zip
免費獲取源碼通過郵箱聯繫我:[email protected]