动机
我们可能需要构建一种通知依赖的关系。一个对象状态发生变化的时候,会通知所欲依赖的对象。
观察者模式
class Observer {
//更新
public:
virtual void update() = 0;
virtual ~Observer(){}
QString mName;
};
class Subject {
//观察者数组
protected:
QVector<Observer*> oVector;
//增加一个观察者
public :
void addObserver(Observer* observer) {
oVector.push_back(observer);
}
//删除一个观察者
void deleteObserver(Observer* observer) {
oVector.removeOne(observer);
}
//通知所有观察者
void notifyObserver() {
QVector<Observer*>::iterator iter;
for (iter=oVector.begin();iter!=oVector.end();iter++){
qDebug()<<"通知"<<(*iter)->mName<<":老板来了!!!!"<<endl;
(*iter)->update();
}
}
};
//员工
class ConcreteObserver :public Observer {
public:
ConcreteObserver(const QString& name){
mName = name;
}
void update() {
qDebug()<<mName<<"接收到通知:关闭股票行情 继续工作!"<<endl;
}
};
//前台
class ReceptionistSubject :public Subject {
//具体业务
public :
ReceptionistSubject(){
}
void notify() {
//...
notifyObserver();
}
};
应用程序:
//前台
ReceptionistSubject Receptionist;
ConcreteObserver* obz=new ConcreteObserver("张三");
ConcreteObserver* lisi=new ConcreteObserver("李四");
Receptionist.addObserver(obz);
Receptionist.addObserver(lisi);
Receptionist.notify();
总结
-
观察者模式使我们独立改变目标与观察者。从而年实现松耦合
-
目标发送通知,无需指定观察者,会自动将通知发送给所有的观察者
-
观察者自己决定是否要订阅通知,目标并不知道