观察者模式是松耦合,对象通过抽象接口像观察者发送信息。当对象发生变化时,所有的观察者都能收到对应的信息。这一点和发布-订阅模式很像,但又不同。发布-订阅是完全不耦合的,发布者和订阅者双方都不知道对方的信息,双方通过第三者消息队列进行交流信息。
Observer: 观察者抽象接口,所有观察者都要继承该类。
ConcreteObserver: 具体的观察者,获取观察对象的状态变化。
Subject: 观察对象的抽象接口。
ConcreteSubject:具体的对象,对所有观察者进行记录,等到自己的状态发生变化时,及时通知所有观察者把自己的状态变化及时通知所有观察者。
下面是代码示例
class Observer
{
public:
virtual void Update(int nstate) = 0; //当观察对象状态更新时会调用该函数
virtual ~Observer();
};
class ConcreteObserver : public Observer
{
public:
void Update(int nstate)
{
std::cout<<"State:"<<"观察的对象状态变成"<<"nstate"<<endl;
}
};
class Subject
{
public:
virtual void Attach(Observer* pOberver) = 0;
virtual void Detach(Observer* pOberver) = 0;
virtual void Notify(int n) = 0;
};
class ConcreteSubject
{
private:
List<Observer*> m_subject;
public:
void Attach(Observer* pOberver)
{
m_subject.push_back(pOberver)
}
void Detach(Observer* pOberver)
{
delete pOberver;
m_subject.remove(pOberver);
}
void Notify()
{
for(auto iter = m_subject.bengin(); iter!= m_subject.end(); iter++)
{
(*iter)->Update(n);
}
}
};
测试代码
void test()
{
Subject* sSub1 = new ConcreteSubject();
Observer* sObser1 = new ConcreteObserver();
Observer* sObser2 = new ConcreteObserver();
sSub1->Attach(sObser1)
sSub1->Attach(sObser2)
sSub1->Notify(5);
delete sSub1;
delete sObser1;
delete sObser2;
}
int main()
{
test();
retuen 0;
}
通过继承Observer ,可以很方便的扩展新的观察者,在Update中可以重写,实现新的功能,这样之前与对象相关的代码无需改动。