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組件都有專門的控制器對象。