一、定义
观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。主要解决的问题是,在一个一对多的依赖关系中,当"一"变化的时候,依赖这个"一"的多也能够同步发生改变。
1. 优点
1)观察者和被观察者是抽象耦合的;
2)建立一套触发机制。
2.缺点
1)如果一个被观察者对象有很多的直接和间接的观察者,将所有的观察者都通知到会花费很多时间;
2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
3.示例
#include <iostream>
#include <list>
#include <string>
using ::std::list;
using ::std::string;
class Observer
{
public:
Observer() {}
virtual ~Observer() {}
virtual void update() {}
};
class Subject
{
public:
Subject(){}
virtual ~Subject() {}
void attach(Observer *observer)
{
m_observers.push_back(observer);
}
void remove(Observer* observer)
{
m_observers.remove(observer);
}
void notify()
{
list<Observer*>::iterator iter = m_observers.begin();
for(;iter != m_observers.end(); iter++)
(*iter)->update();
}
virtual void setStatus(string s)
{
m_status = s;
}
virtual std::string getStatus()
{
return m_status;
}
private:
list<Observer* > m_observers;
protected:
std::string m_status;
};
class ClassSubject: public Subject
{
public:
ClassSubject(string name):m_name(name) {}
~ClassSubject() {}
void setStatus(string s)
{
m_status = s ;
}
string getStatus()
{
return m_status;
}
private:
string m_name;
};
class ClassObserver : public Observer
{
public:
ClassObserver (string name,Subject *subject):m_name(name),m_subject(subject)
{
}
~ClassObserver () {}
void update()
{
std::string status = m_subject->getStatus();
cout << m_name <<"-------" << status <<endl;
}
private:
std::string m_name;
Subject *m_subject;
};
#include "observer.h"
int main()
{
Subject *subject = new ClassSubject("huamoxian");
Observer *observer = new ClassObserver("hello",subject);
subject ->attach(observer);
subject ->setStatus("说话!");
subject ->notify();
system("pause");
delete subject ;
delete observer;
return 0;
}