1.2 Smalltalk MVC中的设计模式
1.2 Smalltalk MVC中的设计模式
在Smalltalk-80
中,类的模型/视图/控制器
( Model/View/Controller)
三元组(MVC)
被用来构建用户界面。透过MVC
来看设计模式将帮助我们理解”模式”这一术语的含义。
MVC含义
MVC
包括三类对象。
- 模型
Model
是应用对象, - 视图
View
是它在屏幕上的表示, - 控制器
Controller
定义用户界面对用户输入的响应方式。
MVC作用
不使用MVC
,用户界面设计往往将这些对象混在一起,而MVC
则将它们分离以提高灵活性和复用性。
模型刷新视图
MVC
通过建立一个”订购/通知”协议来分离视图和模型。视图必须保证它的显示正确地反映了模型的状态。一旦模型的数据发生变化,模型将通知有关的视图,每个视图相应地得到刷新自已的机会。这种方法可以让你为一个模型提供不同的多个视图表现形式,也能够为一个模型创建新的视图而无须重写模型。
下图显示了一个模型和三个视图(为了简单起见我们省略了控制器)。模型包含一些数据值,视图通过电子表格、柱状图、饼图这些不同的方式来显示这些数据。当模型的数据发生变化时,模型就通知它的视图,而视图将与模型通信以访问这些数据值
表面上看,这个例子反映了将视图
和模型
分离的设计,然而这个设计还可用于解决更一般的问题:将对象分离,使得一个对象的改变能够影响另一些对象,而这个对象并不需要知道那些被影响的对象的细节
。这个更一般的设计被描述成Observer
模式(见5.7小节)MVC
的另一个特征是视图可以嵌套。例如,按钮控制面板可以用一个嵌套了按钮的复杂视图来实现。对象查看器的用户界面可由嵌套的视图构成,这些视图又可复用于调试器。MVC
用View
类的子类— CompositeView
类来支持嵌套视图。 CompositeView
类的对象行为上类似于View
类对象,一个组合视图可用于任何视图可用的地方,但是它包含并管理嵌套视图。
上例反映了可以将组合视图与其构件平等对待的设计,同样地,该设计也适用于更一般的问题:将一些对象划为一组,并将该组对象当作一个对象来使用。这个设计被描述为Composite(4.3)
模式,该模式允许你创建一个类层次结构,一些子类定义了原子对象(如Button
)而其他类定义了组合对象( CompositeView)
,这些组合对象是由原子对象组合而成的更复杂的对象。MVC
允许你在不改变视图外观的情况下改变视图对用户输人的响应方式。例如,你可能希望改变视图对键盘的响应方式,或希望使用弹出菜单而不是原来的命令键方式。MVC
将响应机制封装在Controller
对象中。存在着一个Controller
的类层次结构,使得可以方便地对原有Controller
做适当改变而创建新的Controller
view
使用Controller
子类的实例来实现一个特定的响应策略。要实现不同的响应策略只要用不同种类的Controller
实例替换即可。甚至可以在运行时刻通过改变View
的Controller
来改变View
对用户输人的响应方式。例如,一个View
可以被禁止接收任何输入,只需给它一个忽略输入事件的Controller
。view-Controller
关系是Strategy(5.9)
模式的一个例子。一个策略是一个表述算法的对象。当你想静态或动态地替换一个算法,或你有很多不同的算法,或算法中包含你想封装的复杂数据结构,这时策略模式是非常有用的。
MVC用到的设计模式
MVC
还使用了其他的设计模式,如:用来指定视图缺省控制器的FactoryMethod(3.3)
和用来增加视图滚动的Decorator((4.4)
。但是**MVC
的主要关系还是由Observer
、 Composite
和Strategy
三个设计模式给出的**。