DirectUI的初步分析(二)

这篇文章是<DirectUI的初步分析>后的延续,在本文中主要是针对整体的框架结合MVC模式来进行分析,不会涉及具体的代码。

(1)Subject(目标)
I)目标知道它的观察者。可以有任意多个观察者观察同一个目标。
II)提供注册和删除观察者对象的接口。
目标应该就是CControlUI类,关于第一点观察者观察的是CControlUI,当多个观察者观察的同一个目标状态发生改变时也就是多视图更新;关于第二点CControlUI中并没有定义这样的接口,这个工作是由CPaintManagerUI来完成的,不过没有再另行定义虚接口类。CPaintManagerUI的功能不仅限于此,还完成了更多的工作,会在下面做详细描述。
(2)Observer(观察者)
为那些在目标发生改变时需获得通知的(观察者)对象定义一个更新接口。
INotifyUI虚接口类的Notify函数。关于这一点单纯的观察者模式是有缺点的,如果存在多个观察者对象那就要为每一个观察者对象定义一个同名方法(即虚函数Notify)这加大了开销。如果用委托那观察者对象的方法就可以不同名(将观察者对象的方法委托给目标)
(3)ConcreteSubject(具体目标)
I)将有关状态存入各ConcreteObserver对象。
II)当它的状态发生改变时,向它的各个观察者发出通知。
应该就是继承自CControlUI或CContainUI等的各种控件类,当有事件触发时会通知观察者对象。关于第一点如进度条拖动时通知观察者对象获取值;关于第二点如按钮按下通知观察者
(4)ConcreteObserver(具体观察者)
I)维护一个指向ConcreteSubject对象的引用
II)存储有关状态,这些状态应与目标的状态保持一致
III)实现Observer的更新接口以使自身状态与目标的状态保持一致
派生自INotifyUI的类如CStandardPageWnd,它实现了Notify虚函数、根据名称或ID获得控件实例对象指针、根据控件通知保存值或控件状态等等。
(5)众所周知MVC方式是从观察者模式演变而来。从第(4)描述来看CStandardPageWnd做为观察者并没有更新视图,原因何在?视图更新的工作实际上由CPaintManagerUI来承担了,这样做的好处就是当目标状态或数据发生改变时视图能立即更新反映变化,观察者收到通知后只需关注状态存储或数据处理,这也是文档视图的分离。
(6)我们知道WINDOW操作系统是基于窗口和消息的系统,所以目标状态的改变也是基于窗口消息触发而改变。CStandardPageWnd的父类CWindowWnd完成了这一部分同平台紧密相关的工作,而CPaintManagerUI完成了消息处理及改变目标状态的工作,理论上来说如果把这两部分加上相对独立的渲染部分替换就可以实现跨平台了。是否可以认为这些是控制器完成的工作?


转自:http://blog.csdn.net/alien75/article/details/6066048


你可能感兴趣的:(工作,mvc,框架,存储,文档,跨平台)