Pattern-Oriented Software Architecture v1巨詳細讀書筆記 4

本筆記不同於《面向模式的軟件體系架構 卷1 模式系統》的翻譯,而是從《Pattern-Oriented Software Architecture vol.1 A system of patterns》原書[page 287-295]直接做的山寨翻譯:),包括了command processor剩餘部分,以及View Handler模式的前半部。

------------------------------------------------

[287]

[變體]
分散的controller功能。在此變體中,controller的角色被分散到多個組件中。如菜單按鈕這樣的每個用戶界面元素都能在激活的時候創建命令對象,但controller的角色並不限制在圖形用戶界面組件中。
同Interpreter模式結合。在此變體中,一種腳本語言爲應用程序提供可編程接口,此腳本的解析器扮演了controller的功能,應用Interpreter模式[GHJV95]從command對象構建抽象語法樹。command processor是Interpreter模式中的客戶端,通過激活command執行解析操作。

[已知應用]
    ……
[288]
    ……




[291]
View Handler
幫助軟件系統管理視圖(view),允許客戶打開、操作、排列視圖,協調相互依賴的視圖,並組織他們更新。
[例子]
多文檔編輯器允許多個文檔同時在一起工作,每個文檔顯示在它自己的窗口中。
[圖]
要使這種編輯器便於使用,需要提供多種操作窗口的功能,例如:爲了使一個文檔上的多個獨立視圖能在一起工作,需要提供窗口克隆功能;爲了在退出編輯器時關閉所有已經打開的窗口,需要保存並跟蹤所有已經打開的窗口,在編輯器關閉時關閉這些窗口;爲了讓一個窗口中的修改能在另一個窗口中反應出來,需要實現窗口間有效的更新機制傳播這種變化。
[環境]
提供特定數據的多視圖軟件系統或支持多文檔的軟件系統。
[問題]
支持多視圖的軟件系統通常需要附加功能來管理這些視圖,客戶能打開、操作、排列視圖,如:窗口及窗口中的內容管理,視圖間相互協作,其中一個視圖改變時能自動將這種變化傳播到相關的其他多個視圖。
Serveral forces drive the solution to this problem:
    - 從用戶直觀的操作和客戶端組件的調用角度出發,應該很容易地在系統中管理多個視圖。
    - 視圖的實現不應該彼此依賴,也不應該和管理視圖的代碼混合在一起。
    - 視圖的實現不同,在系統的生命週期中都可以添加附加類型的視圖。

[解決方案]
從特定視圖的表示或控制代碼中分離出管理視圖代碼。
View Handler組件管理系統中提供的所有視圖,提供視圖管理的所有必要功能,能打開、關閉、協調、處理視圖,如:命令‘排列’,能按順序將視圖排列起來。
(??)Specific View、表示和操控他們的功能一起被封裝在分離的視圖組件中,supplier給視圖提供他們所表示的數據。
View Handler模式像Model-View-Controller模式建議的一樣,採用了從功能核心中分離出表示(presentation)的思想,但它不提供軟件系統中所有的結構,它只是從Model和View組件中分離出管理所有View的職責,以及分離出他們之間的相互依賴關係,將這些職責賦予View handler,例如:視圖不需要管理他的子視圖。因而,View Handler模式比Modle-View-Controller模式的粒度更佳,它能爲精化Modle和相關的View之間的關係提供幫助。
可以用Abstract Factory[GHJV95]和Mediator[GHJV95]來考慮View Handler組件。client是獨立於如何創建Specific View的,這就如同Abstract Factory一樣;同樣client也獨立於View之間的協作,這也如同mediator一樣。
[293]
在文檔編輯器的例子中,我們爲每種文檔窗口提供了一個View組件,系統提供窗口用來:編輯文檔,打印預覽,瀏覽文檔頁縮略圖,一個View Handler將用來管理這些View,除了創建和刪除窗口,View Handler還提供了:將特定窗口顯示到最前端,克隆最前端的窗口,排列窗口讓他們不重疊等等功能。窗口的supplier就是被顯示的文檔,同一個文檔可以同時有多個View,而且還能同時顯示多個文檔。


[結構]
View Handler是此模式的中心組件。它負責打開client指定需要的特定新View,它會實例化相應的View組件,並保證他們的正確初始化,然後請求新的View把它自己顯示出來;如果請求的View已經打開,View Handler會將這個View顯示到最前端;如果請求的View已經打開,但是被最小化了,View Handler會讓此View將它自己用全尺寸的方式顯示出來。
View Handler也提供關閉View的功能,它會根據退出應用程序時的需要選擇是關閉一個View或者是所有當前已經打開的View。
View Handler的主要職責是提供View管理服務,包括功能如:將特定View顯示到最前端,排列所有的View,將一個View分割成多個部分,刷新所有View,一個文檔上View的克隆。這些管理功能,如果被分散在很多不同的View組件中將很難組織起來。
[圖]
[page 294]
協作是View Handler的一個附加職責。View間也許有依賴關係,就像ET++[WGM88]中的VObjectText對象一樣,多個View顯示了一個組合文檔的不同部分。在排列這些View時,應該將他們逐個排列。如果用戶在此文檔的一個View中做了更改,則應該按照某種預定的次序更新其他View,比如:顯示最全局信息的View應該第一個被更新。

Abstract View組件定義所有View的公共接口,View Handler用這個接口來創建、關閉、協調所有的View,此係統之下的平臺用此接口執行用戶事件響應,如:調整窗口大小。Abstract View接口必須提供View所有可能執行的操作函數。

Specific View組件從Abstract View繼承,並實現它的接口。此外每個View實現它自己的顯示函數,此函數從View的supplier獲取數據,把數據準備好並呈現給用戶,此函數在打開和更新View時會被調用。
[圖]

Supplier組件爲View組件的顯示提供數據。它給客戶端(如:View)提供了獲取及更改數據的接口,在內部狀態被修改時,它會通知依賴於它的組件,這些組件可以是獨立的View,也可以是組織更新的View Handler。

[page 295]
[圖]

以下的OMT類圖顯示了View Handler模式的結構:
[圖]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章