Observer 模式在实践中的应用场景:
为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程。将更改过程打印在控制台上。考虑使用松耦合设计。
代码:
#include <list>
#include <iostream> using namespace std; struct Observer;
struct Subject
{
virtual void attach(Observer*) = ;
virtual void detach(Observer*) = ;
virtual void notify() = ;
virtual int getX() = ;
virtual int getY() = ; list<Observer*> _observer;
}; struct Observer
{
virtual void update(Subject*) = ;
}; struct ConsoleObserver : public Observer {
virtual void update(Subject *subject)
{
cout << subject->getX() << " " << subject->getY() << endl;
}
}; class Point : public Subject{
int _x;
int _y; public:
virtual void attach(Observer* o)
{
this->_observer.push_back(o);
} virtual void detach(Observer* o)
{
this->_observer.remove(o);
} virtual void notify() {
for (auto e : _observer)
e->update(this);
} Point(int x, int y) : _x(x), _y(y) {} void setX(int x)
{
this->_x = x;
this->notify();
} void setY(int y)
{
this->_y = y;
this->notify();
} int getX()
{
return this->_x;
} int getY()
{
return this->_y;
}
}; int main()
{
Point po(, ); //绑定
ConsoleObserver co;
po.attach(&co); //值的每一次变化,都会引起控制台打印
po.setX();
po.setY(); return ;
}