读书人

一个model两个view解决方案

发布时间: 2012-03-16 16:34:56 作者: rapoo

一个model,两个view
我在做一个小软件,里面涉及到一个模型,还有两个视图:一个是表格,一个是图形显示。这两个视图都有交互性,而且是同步的:当用户选择表格里一行的时候,图形显示里面相应的部分被高亮;当点击图形的时候,表格相应的一行被选择。

下面问题就来了:
假如我这样设置回调来更新它们,就会有严重的问题,因为表格在被更改的时候,会触发一个changed事件,使得changed回调函数又被调用,就绕进去了:

Perl code
sub on_table_selection_change {    select_data;}sub on_graph_clicked {    select_data;}sub on_data_selected {    change_table;    change_graph;}

于是,我只能这样回调。但我不喜欢这样,因为graph把自己的一部分事务塞给了table,相当于紧耦合两个元件:
Perl code
sub on_table_selection_change {    change_graph;}sub on_graph_clicked {    change_table;}

有什么别的策略来构建这些回调么?

[解决办法]
这一块应该是由MVC中的C来控制的呀

不论是表格还是图形显示接收了UI事件,它们全部传给控制器来统一控制;

如果有的代码因为工程模板的问题比较死,那么就一个UI界面接收事件,然后调用更新其它UI的事件即可;

不会出现互相调用而无止境的问题
[解决办法]
搜索 观察者模式,还是叫订阅者模式..

互相注册为观察者,任何n方都会得到处理,观察者只专心自己的处理.被观察者当时间发生时去停止观察者或者直接调用观察者注册的方法.
[解决办法]
我来分析一下上面的Model/View模型。

通常情况下,数据存储于Model,View仅仅绘制用于展示数据的视图。

C/C++ code
class Model{private:    DATA m_data;    vector<View *> m_views;public:    ModifyData();};class View1 : View{private:    Model *m_model;public:    void Update();};class View2 : View{private:    Model *m_model;public:    void Update();};
[解决办法]
好像有一个中介者模式,经常用来做UI的交互

读书人网 >C++

热点推荐