Java用户界面 模型-视图-控制器(MVC)模式
Java中的Swing用户界面组件的模型-视图-控制器设计模式(MVC).
Swing组件的MVC设计模式
在解决一个问题时,不需要从头做起,而是参考过去的经验,设计模式是一种方法,以一种结构化的形式展示了前人的经验。
前面提到过的Java中的AWT事件处理机制采用了“观察者”(Observer)模式。
本文要说的是Swing设计者采用的另一种著名的设计模式:模型-视图-控制器(model-view-controller)模式。
MVC设计模式
用户界面组件一般有三个要素:
1.内容,如按钮的状态(是否按下),或者文本域的文本。
2.外观, 颜色,大小等等。
3.行为,对输入事件的反应。
模型-视图-控制器(MVC)模式,不是用一个类完成所有的事情,而是实现三个独立的类:
模型(model):存储内容。
视图(view):显示内容。
控制器(controller):处理用户输入。
这个模式明确地规定了三个对象如何进行交互。模型存储内容,实现改变内容和查找内容的方法,它没有用户界面,模型是完全不可见的,显示存储在模型中的数据是视图的工作。
比如文本域的内容是容纳当前文本的字符串对象,与视图显示的内容并不一致——如果内容的长度大于文本域的显示长度,用户只能看到显示出来的那一部分。
模型-视图-控制器(model-view-controller)模式的一个优点是一个模型可以有多个视图,其中每个视图可以显示全部内容的不同部分或不同方面。当通过某一个视图的控制器对模型进行更新时,模型会把这种改变通知给所有视图,视图得到通知之后就会自动刷新。
控制器负责处理用户输入事件,例如点击鼠标和敲击键盘,然后决定是否把这些事件转化成对模型或视图的改变。
程序员使用Swing组件
程序员使用Swing组件通常不需要考虑它们的模型-视图-控制器体系结构。
每个用户界面元素都有一个包装器类(如JButton或JTextField)来保存模型和视图。
当需要查询内容时,包装器类会向模型询问并返回结果。当想改变视图时,包装器类会把此请求发给视图。然而有时候也需要直接同模型打交道。
MVC模式允许实现可插观感。每个按钮或者文本域的模型是独立于观感的。通过把底层模型与用户界面分离开,Swing设计者能够重用模型的代码,甚至在程序运行时对观感进行切换。
Swing按钮的MVC分析
对于大多数组件来说,模型类实现了名字结尾为Model的接口。例如,按钮类就实现了ButtonModel接口。
每个JButton对象存储一个按钮模型对象,可以用下列形式得到它的引用。
JButton button = new JButton("Blue"); ButtonModel model = button.getModel();
当使用Metal观感时,JButton类用BasicButtonUI类作为其视图,用ButtonUIListener类作为控制器。
一般来说,每个Swing组件都有一个相关的后缀为UI的视图对象,但并不是所有的Swing组件都有专门的控制器对象。