观察者模式
使用场景
当对象间存在一对多关系时,则使用观察者模式(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
免费获取源码通过邮箱联系我:867564473@qq.com