要点:
1、如何使用观察者模式:
对应使用这个模式的用户(main)来说,subject和observer这两个基类是不被关系的,在调用者(main)中只是有concreteSubject和concreteObserver这两个具体目标和具体观察者来构建对象和程序。
int _tmain(int argc, _TCHAR* argv [])
{
ConcreteSubject* CS = new ConcreteSubject();
ConcreteObserver* CO = new ConcreteObserver(CS);
ConcreteObserver* CO1 = new ConcreteObserver(CS);
UpdateData* UD = new UpdateData();
UD->FirstValue = 123;
UD->SecendValue = 456;
CS->SetData(UD);
return 0;
}
2、信息刷新的操作由谁发起
观察者和目标都可以发起数据刷新的操作,但是从习惯上来讲由目标来刷新数据更为直观合理。
3、代码实现的要点:
将目标基类对象(subject)作为一个参数传递到观察者具体类的构造函数中(ConcreteObserver.ConcreteObserver(Subject*)),然后将这个Subject对象作为ConcreteObserver的一个成员变量存储起来,而后调用这个成员变量的Attach方法,即把观察者注册给目标,就好比完成了把订报读者的地址信息注册到邮局一样。
ConcreteObserver::ConcreteObserver(Subject* s)
{
_subject = s;
_subject->AttachObserver(this);
}
5、程序的执行流程
将观察者注册给目标,从而让目标知道谁需要更新数据。
更新具体目标类对象的数据,更新方法由具体目标类对象调用目标基类的遍历方法,遍历所有注册的具体观察者对象,然后调用这些具体观察者的Update方法实现更新。
6、观察者模式和C#事件的关系
如果忽略委托的动态绑定函数的功能,事件编程模式和观察者模式是相同的。
事件的定义方(定义Event的类)就是目标,注册事件方法的地方就是观察者(即写xEvent+=***的地方)。
这样理解起来更直观:事件定义方(目标)只关心什么时候发数据。事件使用方只关心收到数据后要干什么。而定义方不用关心这些数据发出去后用于什么用途,使用方也不必关心什么时候会收到数据。而数据发给谁或者该接收谁的数据是由调用这个结构的用户来决定绑定关系的。
在事件模式中只存在目标和调用者,即调用者就是观察者。而在观察者模式中有三个角色:调用者(main函数)、目标、观察者。
7、观察者模式通常用来实现MVC架构