花了一上午,初步实现一个简单的MVC框架,原理如下:
两个线程一个控制线程(处理业务逻辑的工作线程),一个视图使用线程(往往应该就是UI线程)。所有视图操作应该在UI线程中操作,业务逻辑和对model的修改在工作线程中做。
实现控制器类PrintController 主要功能是处理用户输入数据,然后更新到模型中;是否及时通知界面也在这里通过model->Notify()来控制——虽然可以在修改每一个model的数据时通知界面,但有的时候更新多个数据后一次通知界面会显得效率更高。
实现视图类PrintView 除了继承ViewBase基类外,还是Observer和ThreadBase的子类;对于Observer,是为了设置在Model当更新时候通知的观察者接口;对于ThreadBase是为了在视图中创建新线程来处理视图功能。PrintTask是任务结构,我认为这里没有设计得合理,接下来尝试不同的方案优化。这里的异步线程任务提交是一个可以进一步很好优化的地方,比如使用C++11的中std::bind来绑定任务然后递交,目前我使用的是vs2008,不支持C++11的这个特性,我打算接下来自己实现std::bind的功能,然后应用进来。
实现模型类PrintModel 这个类的功能相对比较清楚明了,就是提供注册观察者的接口(view),实现数据的读取与更改。我使用友元尝试不让视图部分更改数据,只让控制器可以修改数据。