Draw2D--1. 設計思想和相關模式

來源:互聯網
上載者:User
設計 1.  Draw2d 設計思想 Draw2d是一個宿主在SWT Composite控制項中的輕量級的構件(widge)系統。一個Draw2d應用程式由一個 SWT Composite控制項, 一個輕量級系統, 以及其內容(figures)組成。Figures是Draw2d的建造塊。下面的“Hello World”例子程式示範了如何?一個最簡單的draw2d程式。Listing for "Hello World"

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.SWT;


 
import org.eclipse.draw2d.*;

import org.eclipse.draw2d.geometry.*;


 
public class HelloWorld {

         public static void main(String args[]){

                 Shell shell = new Shell(); 

                 shell.open();

                 shell.setText("Draw2d Hello World");

                 LightweightSystem lws = new LightweightSystem(shell);   

                 IFigure label = new Label("Hello World");

                 lws.setContents(label); //設定內容

                 Display display = Display.getDefault();

                 while (!shell.isDisposed ()) {

                          if (!display.readAndDispatch ())

                                   display.sleep ();

                 }

         }

}

運行這個程式的結果如下: 在上面例子程式的背後究竟發生了什麼呢?先看下面的Draw2d設計圖:



 
 
LightweightSystem是Draw2d的粘合劑。開發人員提供SWT composite和想要繪製的figure層次的根,然後LightweightSystem用預設值啟動剩餘的過程。LightweightSystem依賴Canvas,並含有一個EventDispatcher和一個UpdateManager。LightweightSystem本身是一個事件監聽器,能夠監聽多種事件。在將Canvas傳遞給LightweightSystem(通常通過LightweightSystem的建構函式)時,LightweightSystem就將自身作為監聽器註冊到Canvas,當Canvas產生各種LightweightSystem感興趣的事件後,作為監聽器,LightweightSystem中定義的方法會被調用。在LightweightSystem中定義的各個監聽器方法中,要將來自於SWT的事件轉換成draw2d事件並通過EventDispatcher將draw2d事件分配到當前被選中的圖形元素Figure。每個圖形元素Figure都可以作為監聽器容器。
 
SWT是IBM開發的一套GUI組件,與java中的SWING是同一類東西,只不過開發商不同罷了。在SWT中有一個名位Canvas的類,這個類是一個控制項,根據它的名字,顧名思義,它是為繪圖提供繪圖表面;它引發各種滑鼠事件和鍵盤事件,它是一個監聽器容器,可以將它引發的互動事件發送給感興趣的監聽器。LightweightSystem是draw2d中一個非常重要的類,它是draw2d能夠啟動並執行調度中樞,這個類的主要作用是:1,  持有Canvas控制項的引用。2,  使自身成為互動事件監聽器,並將自身註冊到Canvas中;當Canvas中引發各種互動事件時,使得LightweightSystem能夠得到通知。3,  持有事件轉寄站。當LightweightSystem從Canvas中獲得互動事件通知後,它直接將該事件轉交給事件轉寄站,事件轉寄站首先將系統事件轉換成draw2d自訂的內部事件,然後根據draw2d的狀態對該事件進行分發。4,  持有更新管理器。當Canvas無效並要求重繪時,LightweightSystem會從來自Canvas的重繪事件中擷取無效矩形地區並請更新管理器更新該無效矩形地區;當draw2d中的某個圖形元素無效時,draw2d也會請更新管理器更新無效的圖形元素。但是,圖形元素無效與控制項無效是兩個概念;當控制項無效時,控制項會引發OnPaint事件;當圖形元素無效時,系統並不會引發OnPaint事件。5,  持有根圖形元素(RootFigure)。根圖形元素在draw2d中有著非常重要的地位和作用,瞭解根圖形元素的地位和作用,對於瞭解draw2d是非常重要的。根圖形元素完全覆蓋在Canvas上(與canvas的工作區域的大小一樣大),它的背景色決定了應用程式的背景色。根圖形元素處於圖形元素樹型層次的最頂端,它只有一個孩子,這個孩子就是要顯示的內容。

 Draw2d中另一個非常重要的介面是IFigure, 它表示圖形元素抽象,所有的可以用圖形顯示的東西都要實現這個介面。Figure是IFigure的基本實現。Figure類的設計,涉及到一個非常著名的模式:Composite模式。 在Draw2d中,Figure中的所有的座標都是int型的,沒有使用float或double類型。我當時也是非常奇怪,但仔細想想,其實也是可以理解的,至於具體原因,我會在以後的文章中詳細解釋。 Draw2d只提供了顯示模型的視圖類,並沒有提供與編輯相關的任何功能;如果開發人員打算開發一個不需要對模型執行編輯的圖形顯示軟體,那麼使用draw2d是合適的;如果要執行編輯動作,就需要同時使用GEF和draw2d了。 

 2. 幾個相關模式 2.1 MVC模式 提到MVC模式,幾乎所有的開發人員都會說,我知道,它不就是“模型-視圖-控制器”嗎?都知道,M表示Model, V表示視圖,C表示Controller。模型要負責提供資料,視圖要負責呈現模型(通常用圖形元素表示模型中的資料),控制器要負責建立圖形元素並修改模型。確實如此,說起來,MVC是一個很簡單的東西,不就是把資料、圖形、控制分開嗎?但說起來容易,做起來可就不容易了。在具體做程式時,通常的情況是,模型、視圖和控制器是三位一體的,往往是一個類表示三個東西。一個類既是模型,也是視圖,也是控制器。在draw2d中,大量使用了模型-視圖的概念,但沒有控制器,因為draw2d庫的主要目的是顯示模型,至於如何編輯模型是GEF的職責,如何定義模型並將模型映射到draw2d上是應用軟體開發人員色職責。在draw2d中定義的所有從Figure派生的圖形元素都是視圖類,它們都是用來呈現模型的;當同GEF一道使用draw2d時,就能體會到draw2d中的“Figure是視圖”這個概念的含義。設計一個基於MVC的應用程式框架相對於設計一個基於MVC的類層次,要難得多;將編輯和顯示獨立到架構中的不同層上需要高超的設計水平。GEF和draw2d就是基於MVC設計的應用程式框架,GEF是控制層,draw2d是顯示層。關於GEF,我會在以後的文章中介紹,GEF的設計非常精彩。我對draw2d中的一個模型—視圖設計印象非常深:範圍模型和捲軸。對一個捲軸而言,它涉及到:最小範圍,最大範圍,當前值, thumb的大小,頁增量。在draw2d中,定義了一個介面RangeModel表示這些資料,並且是一個監聽容器。捲軸持有範圍模型,並將自身作為監聽器註冊到範圍模型中。當捲軸發生滾動時,它會修改範圍模型,然後範圍模型再通知其它對範圍模型資料變化感興趣的外部對象;當範圍模型的資料被外部對象改變之後,它就通知捲軸改變自身的顯示以保持與範圍模型的資料相一致。在以後的文章中,我會重點介紹視口,視口就非常精彩地使用了範圍模型來與捲軸通訊並保持同步。需要指出的是,這裡介紹的捲軸實際上是視圖和控制器地合成體,它是視圖和控制器二者功能的合并。在draw2d中,MVC設計模式比較多。 
 
2.2 Composite模式 draw2d中的圖形元素類層次採用Composite模式。用IFigure表示圖形元素抽象,用Figure表示IFigure的基本實現並包含IFigure介面。Composite模式的動機是:將對象組合成樹形結構以表示“部分-整體”的階層,Composite使得使用者對單個對象和組合對象的使用具有一致性。在.Net中的GUI控制項陳列庫就是採用的Composite設計模式,因為各種控制項之間存在明顯的部分與整體關係,例如Form類從Control派生,但很明顯它又是一個控制項容器,可以包含各種控制項。draw2d是一個輕量級的widget構件系統,它提供了幾乎與常用的控制項對等的各種圖形元素構件(例如按鈕、捲軸)等;但這些圖形元素構件不是控制項,它們緊緊只是從Figure派生的圖形元素,這也是draw2d被稱之為輕量級widget系統的原因。因為draw2d是一個構件庫,而構件本質上就存在著“部分-整體”關係,所以draw2d中的圖形元素也就自然而然的採用了Composite模式。因為採用了Composite模式,所以在一個基於draw2d應用程式中,圖形元素是呈樹狀的,嚴格來說,一個應用程式中只存在一個圖形元素,這個圖形元素就代表應用程式要顯示的內容(稱之為內容圖形元素);內容圖形元素可以包含孩子,孩子又可以包含孩子……,子孫無窮盡也。                    Draw2d圖形元素設計圖  2.3 觀察者模式這個模式在Java中已經被提升到了一個很重要的位置,以至於Java類庫都直接支援它。Java中的事件處理機制就是基於觀察者模式實現的,因為draw2d是一套輕量級的widget構件系統,所以圖形元素能夠引發事件,也能夠接收事件。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.