这几天在看MVC模式,用来改造一个程序
参考材料为《head first 设计模式》
先把画的一个流程图拿出来溜溜
流程举例:
拿书上的例子来说,当用户在界面上设置BPM值的时候,View类中actionPerformed函数会因为这一动作而被调用,
actionPerformed判断出用户点击了设置按钮,调用函数获取设置的具体值bmp,然后调用Control的setBPM函数,bmp作为参数传入。
即用户的响应,具体怎么处理由Control来决定!
在书中,Control调用了Model的setBPM,即更新Model中数据。
而Model中setBPM()中,对成员bpm进行了更新,
然后通知了观察者,即View,代码上体现为调用View的一个Update函数,UpdateBMP()
在View的UpdateBMP()中
通过调用Model的getBMP(),得到了最新数据,然后显示出来。
整个流程从View->Control->Model->View,
如果不采用MVC,最简单的方案是所有数据和响应放到一个类中,CTotal,
CTotal监听并处理用户响应,数据和所有响应代码都在其中。
MVC虽然流程繁琐,但是,做到了低耦合,比如现在要换一套界面,从控制台Console换到GUI,那么修改View类即可。
而CTotal的方案改起来就非常麻烦!!!
笔记如下:
模型包含了所有的状态、数据和应用逻辑
控制器操作模型
模型通知视图状态的改变!
注意,书中531页的问答中说,控制器也可以变成模型的观察者。因为在某些设计中,控制器会向模型注册,模型一有改变就会通知控制器。当模型直接影响到用户界面时,就会这么做。比方说,模型内的某些状态可以支配界面的某些项目变成有效或无效,如果这样,要求视图更新相应显示就是控制器的事。
控制器的作用是获取用户的输入并解读其对模型的意思,也有可能
需要告诉视图改变其结果,比如灰化某些按钮!
视图用来呈现模型,视图通常直接从模型中取得它需要显示的状态与数据
P532
模型利用观察者模式让控制器和视图可以随最新的状态改变而更新
另一方面,视图和控制器则实现了策略模式
P537
一:
模型使用观察者模式
模型是真正干活的,对数据进行各种加工和操作!!!!
允许视图和控制器成为观察者
P540
视图持有模型和控制器的引用!
代码层次则是视图类拥有指向模型类和控制器类的指针
通过视图,获取了要显示的数据
视图自身创建各种界面元素
并提供接口让外部 改变用户界面!!!
注意:
在视图的构造函数中:
1 对模型和控制器引用进行了赋值!
2 将视图注册为模型的观察者!!
视图的某些更新界面的函数会被模型中的通知函数调用!!
P543
控制器持有模型和视图的引用
在控制器的构造函数中,参数为模型引用
在构造函数中,首先对模型进行了赋值,
然后新建了一个视图,调用了模型和视图的一些初始化函数!
控制器帮助视图做决定:即控制器调用视图的接口
总结: 主要是各种调用!!!
总之:
一个类的函数分为两种:
- 操作自身数据,被别的类调用
- 调用其他类的函数
1 模型:
直接对数据进行操作的函数
获取数据的函数,供外界调用
模型中有些数据需要在视图中显示,当这些数据发生变化时
通知观察者(视图)进行界面的更新!
2 视图
视图中更新界面的函数由模型调用!
视图中用户操作响应函数中调用控制器响应函数
3 控制器
控制器构造函数中创建视图,初始化模型
各种响应函数被视图调用,
响应函数中调用模型和视图相关函数!
比如灰化按钮,设置数据新值!