您的位置:首页 > 其它

观察者模式(observer pattern)

2015-08-17 18:46 274 查看
观察者模式:

定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。

结构图:



C++实现:

class Observer;

class Subject {
public:
virtual void attach(Observer *o) = 0;
virtual void detach(Observer *o) = 0;
virtual void notify() = 0;
};

class Observer {
public:
virtual void update(int val) = 0;
};

class mySubject : public Subject {
private:
set<Observer*> obs;
int value;
public:
void attach(Observer *o) { obs.insert(o); }
void detach(Observer *o) { obs.erase(o); }
void setVaule(int val) {
value = val;
notify();
}
void notify()
{
set<Observer*>::iterator it;
for (it = obs.begin(); it != obs.end(); ++it)
{
(*it)->update(value);
}
}
int getValue() { return value; }
};

class observerA : public Observer {
private:
int value;
Subject *psj;
public:
observerA(Subject *p): psj(p) { psj->attach(this); }
void update(int val)
{
value = val;
display();
}
void display()
{
printf("current value: %d\n", value);
}
~observerA() { delete psj; }
};

class observerB : public Observer {
private:
Subject *psj;
public:
observerB(Subject *p): psj(p) { psj->attach(this); }
void update(int val)
{
if (val > 0)
printf("good news\n");
else
printf("bad news\n");
}
~observerB() { delete psj; }
};

int main()
{
mySubject subj;
observerA a(&subj);
observerB b(&subj);
subj.setVaule(1);
subj.detach(&a);
subj.setVaule(2);
}


观察者模式涉及到的一个设计原则是:松耦合设计。改变subject或observer其中一方,并不会影响另一方。只要它们之间的接口仍被遵守,我们就可以自由地改变它们。

PS:

观察者模式的一个例子是MVC,现在没接触到,先这样吧。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: