面向?qū)ο蠓治雠c設(shè)計 課件 第13章 面向?qū)ο蠓治鲈O(shè)計案例_第1頁
面向?qū)ο蠓治雠c設(shè)計 課件 第13章 面向?qū)ο蠓治鲈O(shè)計案例_第2頁
面向?qū)ο蠓治雠c設(shè)計 課件 第13章 面向?qū)ο蠓治鲈O(shè)計案例_第3頁
面向?qū)ο蠓治雠c設(shè)計 課件 第13章 面向?qū)ο蠓治鲈O(shè)計案例_第4頁
面向?qū)ο蠓治雠c設(shè)計 課件 第13章 面向?qū)ο蠓治鲈O(shè)計案例_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第13章面向?qū)ο蠓治鲈O(shè)計案例學(xué)習(xí)目標(biāo)

通過案例鞏固和加強(qiáng)對軟件開發(fā)過程中用例模型的作用和建模方法的理解

加強(qiáng)對軟件結(jié)構(gòu)模型設(shè)計過程和方法的理解,加強(qiáng)對概念模型及其獲取方法的理解

理解應(yīng)用程序架構(gòu)在軟件設(shè)計中的地位、作用及其應(yīng)用方法

理解動態(tài)建模在軟件設(shè)計過程中的作用和使用方法第13章面向?qū)ο蠓治鲈O(shè)計案例為了更直觀有效地幫助讀者理解和掌握面向?qū)ο蟮姆治雠c設(shè)計方法,本章將給出一個完整的“交互式圖形編輯軟件”的分析和設(shè)計案例。案例內(nèi)容涵蓋了期望這個案例可以為讀者加深對面向?qū)ο蠓治龊驮O(shè)計領(lǐng)域的概念、方法和技術(shù)等學(xué)習(xí)提供有效的幫助。13.1軟件概述交互式圖形編輯軟件是一個運(yùn)行在Windows系統(tǒng)下的簡單的圖文編輯軟件,其主要功能是編輯一個以直線、矩形、多邊形、橢圓、圖片以及文本等多種基本圖形元素構(gòu)成的圖形文檔。這個軟件的主要用途是作為一個教學(xué)軟件。教學(xué)過程中,可以將軟件視為一個實驗素材,讀者可以閱讀這個軟件的全部內(nèi)容(如系統(tǒng)分析、設(shè)計以及程序源碼等全部資料),也可以根據(jù)自己的興趣修改和擴(kuò)充這個軟件,從而幫助讀者學(xué)習(xí)和理解面向?qū)ο蠓治龊驮O(shè)計方面的內(nèi)容。13.1軟件概述本軟件的目的決定它只有一個用戶角色。使用時,期望讀者從開發(fā)者的視角來討論和研究本案例中的分析和設(shè)計問題。為了更好的幫助初學(xué)者學(xué)習(xí),本案例不僅給出了軟件的分析和設(shè)計方面的描述,還給出了軟件的全部源代碼。通過閱讀這些源代碼,讀者可以從分析、設(shè)計與實現(xiàn)等多個角度來分析和討論問題。最后要說明的問題是,本軟件僅僅是一個簡單的學(xué)習(xí)軟件,任何人都可以隨意使用這個人軟件的全部內(nèi)容。另外,由于受到時間和技術(shù)能力等因素的限制,軟件中一定能會存在著各種各樣的缺點、缺陷甚至是錯誤。對這方面的問題,敬請讀者諒解,也歡迎讀者給予批評和指正。本章將分別討論本案例的分析、設(shè)計和實現(xiàn)方案。13.2軟件功能結(jié)構(gòu)由于交互式圖形編輯軟件僅是一個用于創(chuàng)建由直線、矩形、多邊形和文本等圖形元素為構(gòu)成要素的數(shù)據(jù)文檔的圖形軟件。所以這個軟件僅有一個參與者,我們稱之為用戶。軟件用例的主要內(nèi)容也就是編輯圖形文檔所需要的各項功能。13.2.1主要參與者由于交互式圖形編輯軟件僅是一個用于創(chuàng)建由直線、矩形、多邊形和文本等圖形元素為構(gòu)成要素的數(shù)據(jù)文檔的圖形軟件。所以這個軟件僅有一個參與者,我們稱之為用戶。軟件用例的主要內(nèi)容也就是編輯圖形文檔所需要的各項功能。13.2.2用例模型用例分類用例名稱說明文檔操作創(chuàng)建文檔創(chuàng)建一個新的數(shù)據(jù)文檔文件,此數(shù)據(jù)文檔文件中沒有任何數(shù)據(jù)打開文檔打開一個已經(jīng)存在的數(shù)據(jù)文檔文件。并將文檔數(shù)據(jù)顯示在屏幕上保存文檔將當(dāng)前文檔保存到磁盤文件中打印文檔將當(dāng)前文檔輸出到指定的打印設(shè)備圖素操作

插入圖素向當(dāng)前文檔中插入一個指定的圖形元素選擇圖素將指定的圖形元素設(shè)置為選中狀態(tài)刪除圖素將選定圖形元素從當(dāng)前文檔中刪除改變位置將選定圖形元素從當(dāng)前位置移動到指定位置改變大小指在不改變圖形元素形狀的情況下,改變選定圖素的大小改變形狀用改變圖素的縱橫比來改變指定圖形元素的形狀改變Z序改變圖形元素的顯示順序撤銷與恢復(fù)撤銷撤銷剛剛執(zhí)行的用戶操作恢復(fù)重新執(zhí)行剛剛撤銷的操作剪貼板操作復(fù)制將選定的圖形元素復(fù)制到剪貼板上剪切將選定的圖形元素從文檔中刪除,并將這些圖形元素存放到剪貼板上粘貼將剪貼板上的數(shù)據(jù)以本軟件能夠接受的形式插入到當(dāng)前文檔中其它修改畫布畫布是指圖形的顯示區(qū)域,改變畫布大小意味著改變軟件所繪制的圖形的顯示區(qū)域的大小表13-2軟件的主要用例及其分類13.2.2用例描述1.文檔操作在本軟件中,文檔可以看成是由圖形元素構(gòu)成的集合,文檔操作是將整個文檔作為操作對象進(jìn)行處理的操作。這種操作的前置條件是已經(jīng)存在了一個或多個文檔對象。1)創(chuàng)建文檔用例用例名:創(chuàng)建文檔用例描述:創(chuàng)建一個新的文檔對象。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:創(chuàng)建了一個新的文檔對象,同時創(chuàng)建并打開一個新的文檔窗口,并把軟件的當(dāng)前狀態(tài)置于新文檔的初始狀態(tài)。用例的事件流:1. 用戶選擇創(chuàng)建新文檔命令。2. 創(chuàng)建一個文檔對象及相應(yīng)的文檔窗口對象,并把這個文檔對象置為當(dāng)前文檔對象。13.2.2用例描述2)打開文檔用例用例名:打開文檔用例描述:打開一個已經(jīng)存在的文檔文件。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:打開一個已經(jīng)存在的文檔文件,創(chuàng)建一個新的文檔窗口,并在這個文檔窗口中顯示這個文檔內(nèi)容,同時把系統(tǒng)至于就緒狀態(tài)。用例的事件流:1.用戶選擇打開文檔命令。2.系統(tǒng)提示用戶輸入文件名。3.系統(tǒng)將檢查文件的存在性以及合法性。若文件不存在,則提示文件名輸入錯誤,并將系統(tǒng)返回到先前的狀態(tài)。4.系統(tǒng)打開這個文件并對文件進(jìn)行合理性檢查,若文件類型非法,則提示用戶文件類型錯誤,并將系統(tǒng)返回到先前的狀態(tài)。否則系統(tǒng)讀入并顯示這個文件的內(nèi)容。13.2.2用例描述3)保存文檔用例用例名:保存文檔用例描述:將當(dāng)前文檔的內(nèi)容保存到指定的磁盤文件中。參與者:用戶前置條件:當(dāng)前文檔非空,即當(dāng)前文檔是一個含有圖形元素的文檔。后置條件:當(dāng)前文檔的數(shù)據(jù)被正確地保存到指定的文件之中。用例的事件流:1.用戶選擇保存文檔命令。2.系統(tǒng)提示用戶輸入文件名。3.系統(tǒng)將檢查文件是否存在。若文件已經(jīng)存在,則提示用戶文件已經(jīng)存在,并詢問用戶是否覆蓋,若用戶輸入不覆蓋,則放棄本次操作。若文件不存在或用戶同意覆蓋,則按用戶輸入的文件名創(chuàng)建文件并將當(dāng)前文檔中的數(shù)據(jù)保存到該文件中去。4.將系統(tǒng)返回到先前的狀態(tài)。13.2.2用例描述4)打印文檔用例名:打印文檔用例描述:將當(dāng)前文檔輸出到系統(tǒng)當(dāng)前的打印管理程序。參與者:用戶前置條件:當(dāng)前文檔非空,即當(dāng)前文檔是一個含有圖形元素的文檔。后置條件:創(chuàng)建了一個新的文檔對象,同時創(chuàng)建并打開一個新的文檔窗口,并把軟件的當(dāng)前狀態(tài)置于新文檔的初始狀態(tài)。用例的事件流:1用戶選擇修改畫布操作命令。2輸入畫布參數(shù)并確認(rèn)。3系統(tǒng)刷新圖形的顯示。13.2.2用例描述5)修改畫布大小用例名:修改畫布大小用例描述:修改當(dāng)前文檔的畫布的尺寸。參與者:用戶前置條件:用戶已經(jīng)打開或選擇了合適的文檔。后置條件:將新的畫布參數(shù)保存到當(dāng)前文檔對象中,并更新了當(dāng)前文檔的顯示。用例的事件流::1用戶選擇修改畫布操作命令。2輸入畫布參數(shù)并確認(rèn)。3系統(tǒng)刷新圖形的顯示13.2.2用例描述6)修改圖素Z序此操作是一個比較特殊的操作,其含義是改變圖形元素的Z軸方向的位置。其主要特點是不改變圖形元素本身的狀態(tài)。改變的僅僅是其顯示位置而已。用例名:修改圖素Z序用例描述:修改指定圖形元素的Z序參與者:用戶前置條件:選擇了合適的圖形元素。后置條件:將新的畫布參數(shù)保存到當(dāng)前文檔對象中,并更新了當(dāng)前文檔的顯示。用例的事件流:1用戶選擇修改畫布操作命令。2輸入畫布參數(shù)并確認(rèn)。3系統(tǒng)刷新圖形的顯示。13.2.2用例描述2.圖素操作1)插入圖素用例名:插入圖素用例描述:向當(dāng)前文檔中插入一個特定的圖形元素。參與者:用戶前置條件:用戶已經(jīng)創(chuàng)建或打開了某個文檔。后置條件:向當(dāng)前文檔中插入了一個指定的圖素對象,并將軟件的當(dāng)前狀態(tài)置于正常狀態(tài)。用例的事件流:1選擇圖形元素類型。2輸入創(chuàng)建的圖形元素的位置等屬性13.2.2用例描述2)選擇圖素用例名:創(chuàng)建文檔用例描述:創(chuàng)建一個新的文檔對象。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:將指定的圖形元素設(shè)置為選中狀態(tài)。用例的事件流:1用戶用鼠標(biāo)器單擊欲選擇的圖形元素2系統(tǒng)清除現(xiàn)有的圖形元素上的選中標(biāo)志。3系統(tǒng)查找出文檔中距離鼠標(biāo)位置最近的圖形元素,再檢查這個最近距離是否小于某個特定的臨界值。如果最近距離小于這個臨界值,則將這個圖形元素設(shè)置成被選中狀態(tài)。4刷新圖形元素的顯示。13.2.2用例描述3)修改圖素修改指定圖形元素的位置、大小、形狀等幾何屬性和顏色線條和刷等非幾何屬性的修改。修改圖素用例又可以分成移動圖形元素的位置、大小、形狀和Z序等多種情況。用例名:修改圖素用例描述:修改指定圖形元素的幾何屬性和非幾何屬性的修改。參與者:用戶前置條件:用戶已經(jīng)選中了某個(或某些)圖形元素。后置條件:刷新了圖形顯示,使被修改的圖形以新的狀態(tài)顯示。并將修改結(jié)果保存在文檔對象中,并使系統(tǒng)處于一個合適的狀態(tài)。用例的事件流:1以適當(dāng)?shù)姆绞剑ㄈ缤蟿?、對話框以及文本輸入?輸入圖形屬性的參數(shù)。2刷新圖形顯示。13.2.2用例描述3.撤銷恢復(fù)操作現(xiàn)代軟件中,撤銷恢復(fù)幾乎是所有編輯類軟件的標(biāo)準(zhǔn)操作了。因此,在這個軟件中自然也定義了這兩個操作。撤銷操作用于撤銷用戶最近剛剛執(zhí)行的操作,操作的結(jié)果是將文檔對象恢復(fù)到被撤銷操作執(zhí)行前的狀態(tài)。而恢復(fù)操作則是重新執(zhí)行剛剛被撤銷的操作。圖13-2抽象用例13.2.2用例描述4.剪貼板操作與撤銷恢復(fù)操作一樣,剪貼板操作也是現(xiàn)代軟件產(chǎn)品中不可或缺的重要組成部分。實現(xiàn)剪貼板操作的問題在于對剪貼板編程技術(shù)的掌握,其具體實現(xiàn)不在本教材中討論。13.2.3概念模型根據(jù)本軟件的目標(biāo)和特點,我們定義了軟件的文檔結(jié)構(gòu),并將這個文檔結(jié)構(gòu)作為軟件的概念模型。圖13-3給出了這個軟件文檔的概念結(jié)構(gòu)。圖13-3文檔結(jié)構(gòu)的概念模型13.3軟件結(jié)構(gòu)設(shè)計在結(jié)構(gòu)設(shè)計階段,首先需要考慮的是如何將概念模型轉(zhuǎn)換成某種特定的開發(fā)環(huán)境支持的軟件結(jié)構(gòu)模型。本軟件使用MFC程序設(shè)計方法實現(xiàn),因此系統(tǒng)的結(jié)構(gòu)設(shè)計必然與MFC程序設(shè)計技術(shù)具有密切的關(guān)系。本軟件將使用MFC的文檔視圖結(jié)構(gòu)作為程序的總體結(jié)構(gòu)框架。其次,到了這一階段就直接開始程序設(shè)計并不是一個好的開發(fā)方法。這樣不僅影響開發(fā)效率,而且軟件開發(fā)質(zhì)量也會受到嚴(yán)重影響。比較好的做法是,到了設(shè)計階段,還需要對軟件的動態(tài)行為進(jìn)行更細(xì)致的建模,并通過動態(tài)建模,不斷細(xì)化和完善系統(tǒng)的結(jié)構(gòu)模型。13.3.1MFC文檔視圖結(jié)構(gòu)簡介圖13-4展示了MFC文檔視圖結(jié)構(gòu)的基本構(gòu)成。文檔視圖框架是一個由MFC提供的應(yīng)用程序類(CWinApp)、主窗口類(CMainframe)、子窗口類(CChildFrame)、視圖類(CView)、文檔類(CDocument)和文檔模版(CDocTemplate)類等構(gòu)成的應(yīng)用程序框架。圖13-4MFC文檔視圖結(jié)構(gòu)的構(gòu)成13.3.1MFC文檔視圖結(jié)構(gòu)簡介主窗口類(CMainframe)表示應(yīng)用程序的主窗口對象,它是整個程序的容器窗口。每個程序?qū)嵗彩怯星矣幸粋€主窗口對象。應(yīng)用程序中的子窗口、對話框、菜單、工具欄以及工具欄等,都是這個主窗口的子窗口對象。子框架窗口(CFrame)對象是主窗口(CMainframe)的子窗口,用于組織應(yīng)用程序的交互界面(CView)。一個主窗口可以有多個子框架窗口。文檔類(CDocument)是文檔視圖結(jié)構(gòu)中最重要的類,可以將其看成是應(yīng)用程序處理的所有(數(shù)據(jù))對象構(gòu)成的集合。視圖類(CView)對象可以看成是窗口中的一個矩形區(qū)域,這個區(qū)域也代表了軟件中最基本的人機(jī)交互界面,幾乎所有基本的交互操作都是通過這個視圖對象中實現(xiàn)的。每個子框架窗口還可以擁有一個或多個視圖。MFC還定義了多個不同的視圖類,其中的一些視圖類就已經(jīng)具有了十分強(qiáng)大的功能,如CEditView類和CRichEditView類就直接封裝了文本編輯方面的交互功能。設(shè)計時,選擇合適的視圖類將可以充分地復(fù)用這些功能。視圖類中,CView類既是所有視圖類的基類,也是其中最基本的類。文檔模版(CDocTemplate)類封裝了文檔(Document)、視圖(View)、框架窗口(Frame)等三種類的RUNTIMECLASS類實例,以及一個用來指定特定文檔(Document)需要的菜單資源的成員變量。一般情況下,當(dāng)你的應(yīng)用程序只處理一種類型的文檔時,應(yīng)用程序不需要訪問這個文檔模版(CDocTemplate)類對象。13.3.2應(yīng)用程序的基本結(jié)構(gòu)下面考慮這個應(yīng)用程序的總體結(jié)構(gòu)設(shè)計,我們選擇MFC的多文檔應(yīng)用程序框架構(gòu)建了本程序的基本結(jié)構(gòu)。圖13-5給出了這個應(yīng)用程序的總體框架。圖中,類CGraphicsApp是MFC類庫中應(yīng)用程序類CWinApp的一個實現(xiàn),其實例表示程序的應(yīng)用程序?qū)ο?;類CMainFrame是框架中CMDIFrameWindEx類的實現(xiàn),其實例表示應(yīng)用程序的主窗口對象;類CChildFrame是子窗口類,其實例是主窗口的子窗口,它也是視圖對象的容器;CGraphicsDocument是文檔類,是框架中文檔類CDocument的一個實現(xiàn);CMultiDocTemplate是MFC特有的文檔模板類,其每個實例都可以封裝一個由子窗口類、視圖類和文檔類的運(yùn)行時類實例(CRuntimeClass類)的組合,這個組合描述了子窗口、文檔以及視圖之間所特有的關(guān)系。從而為支持多文檔程序框架提供了一種方便的實現(xiàn)機(jī)制。最后,CGraphicsElement類是自定義的圖形元素類。圖13-5程序總體結(jié)構(gòu)框架13.3.3圖形文檔類的設(shè)計首先考慮文檔類的設(shè)計,設(shè)計內(nèi)容即包括文檔類的物理結(jié)構(gòu)設(shè)計,也包括文檔元素類的設(shè)計。好的設(shè)計應(yīng)嚴(yán)格封裝文檔的物理結(jié)構(gòu),以使得外部對象僅按照某種特定的邏輯訪問這些文檔對象。13.3.3圖形文檔類的設(shè)計1.圖形元素類從前面的概念模型中,可以看出圖形元素時文檔中最重要的組成元素,這些元素的首要特征是元素的結(jié)構(gòu)特征。軟件支持多種不同的類型的圖形元素。而從擴(kuò)充的角度來講,概念模型中也許并未包含所有最終的圖形元素類型。但這些圖形元素的共同特征是,它們均包含了描述圖形元素的拓?fù)浣Y(jié)構(gòu)所需的幾何特征和其它信息(如顏色、紋理和寬度等信息)所需的非幾何特征。必要時,它們還可能包括某種特定的語義特征(如,應(yīng)用于特定領(lǐng)域的圖形元素所具有的語義特征)。其次,這些圖形元素的第二個方面的特征是圖形元素的組合性,即可以將多個簡單的圖形元素組合成更復(fù)雜的復(fù)合元素。這使得文檔結(jié)構(gòu)具有更復(fù)雜的層次結(jié)構(gòu),從而支持用戶編輯更具有層次感的文檔結(jié)構(gòu)。另外,復(fù)合元素的引入還會為軟件帶來更好的可擴(kuò)充性。如,從一個單頁的文檔擴(kuò)充成多頁的文檔結(jié)構(gòu)等。13.3.3圖形文檔類的設(shè)計第三方面的特征是定義在圖形元素上的各種操作,這些操作可分為元素操作、元素組操作以及復(fù)合操作等多種情況。元素操作指操作對象是單個的圖形元素的操作,即直接修改圖形元素狀態(tài)的簡單操作,如修改、移動、刪除和Z序操作等。元素組操作指定義在多個元素(元素集合)之上的操作,如移動、修改和刪除成組元素的操作。還包括對多個元素進(jìn)行的組合和解組等集合操作。復(fù)合操作則是指定義在操作之上的操作,如撤銷和重做操作。上面所有這些因素,都影響著軟件實體類的設(shè)計,好的設(shè)計應(yīng)該能夠充分地支持或反映所有這些結(jié)構(gòu)特征和功能特征,更應(yīng)該使軟件在實現(xiàn)這些操作時具有好的可靠性和時空性能。13.3.3圖形文檔類的設(shè)計CGraphicsElement類中定義了所有圖形元素共有的屬性,包括圖形元素的基本屬性、幾何屬性和非幾何屬性等。1)基本屬性指所有圖形元素所共有的屬性。本軟件的基本屬性被定義成圖形元素的包圍盒,即一個包含了圖形元素所有頂點的最小矩形區(qū)域,用于支持圖形元素的拖放操作。2)語義屬性語義屬性是一種用于表示模型元素所具有的特定語義的屬性。當(dāng)軟件屬于某個特定的應(yīng)用領(lǐng)域時,可使該應(yīng)用域的特定的語義屬性表示。這個軟件的語義屬性被簡單地定義成一段文本。這些屬性定義如下:intleft,top,right,bottom; //表示圖形元素的矩形包圍盒。CStringText; //用戶定義的字符串13.3.3圖形文檔類的設(shè)計3)幾何屬性用于表示圖形元素的基本拓?fù)浣Y(jié)構(gòu),如表示圖形的位置、大小和形狀等方面的屬性。本軟件中,幾何屬性被簡單定義地成一個圖形頂點的集合。CArray<CPoint,CPoint&>mVertexArray;4)非幾何屬性用于描述繪制圖形元素時所需要的屬性。例如圖形中線的色彩、粗細(xì)、形狀和風(fēng)格等方面特征的屬性。圖13-6圖形元素類的設(shè)計2.圖形元素的非幾何屬性為了能夠以統(tǒng)一的方式使用各種圖形屬性,定義了一個抽象的圖形屬性類(CElementProperties),作為圖形屬性對象的接口,并得到了一個的層次結(jié)構(gòu)。圖13-7圖形元素的非幾何屬性13.3.3圖形文檔類的設(shè)計表13-1圖形元素的非幾何屬性序號圖形元素圖形元素類對應(yīng)的非幾何屬性類1直線ClineClineProperties2矩形CReactagleCFigureProperties3橢圓CEllipseCFigureProperties4多邊形CPolyRectangleCFigureProperties5文本CTextCTextProperties6圖片CPictureCPictureProperties7復(fù)合元素CCompositeElementCCompositeProperties8頁CPageCCanvasProperties13.3.3圖形文檔類的設(shè)計容易看出,矩形CReactagle、橢圓CEllipse和多邊形CPolyRectangle等類的非幾何屬性的定義是相同的,它們使用了非幾何屬性(CFigureProperties)。這樣設(shè)計的目的是盡量減少這些類之間數(shù)據(jù)定義甚至是程序代碼之間的冗余,這更有利于有助于提高程序的設(shè)計效率。13.3.3圖形文檔類的設(shè)計3.圖形元素類的方法表13-2圖形元素類的主要方法序號方法說明1virtualCGraphicElement*Clone();深度復(fù)制圖形元素對象2virtualvoidSerialize(CArchive&ar);序列化函數(shù),用于序列化當(dāng)前對象3virtualvoidDraw(CDC*pDC);繪制函數(shù),用于繪制圖形元素4virtualvoidDrawFrame(CDC*pDC);繪制邊框,用于繪制圖形的矩形包圍盒5virtualintIncluded(CPointpoint);判斷指定點是否包含于圖形的區(qū)域內(nèi)6virtualenumPointAtPointAt(CPointpoint);返回指定點關(guān)于當(dāng)前圖素的相對位置7virtualintAdjust(CGraphicElement*Orgin);調(diào)整大小,按指定圖素的大小調(diào)整圖形元素的大小8virtualintOffset(CGraphicElement*Orgin,intdx,intdy);移動位置,按指定圖素的位置移動當(dāng)前圖形元素的位置9virtualvoidSetVisible(boolIsVisible=true);設(shè)置可見標(biāo)識13.3.3圖形文檔類的設(shè)計4.復(fù)合元素類的設(shè)計所謂的復(fù)合元素是指圖形文檔中,若干個簡單元素或復(fù)合元素構(gòu)成的元素。圖13-8描述了軟件中復(fù)合元素的設(shè)計,圖中的CCompositElement就是所謂的復(fù)合元素。它一方面繼承了CGraphicsElement的接口,另一方面還被定義成了CGraphicsElement元素的集合。這個設(shè)計應(yīng)用了GOF模式中的組合模式。它使得用戶可以將圖形文檔中的簡單元素組成更大的復(fù)合元素,從而使用戶可以構(gòu)建更復(fù)雜的復(fù)合文檔。13.3.3圖形文檔類的設(shè)計圖13-8復(fù)合元素的設(shè)計13.3.3圖形文檔類的設(shè)計4.復(fù)合元素類的設(shè)計另外,圖13-8中還描述了一個特殊的復(fù)合文檔類CPage。這個對象被定義成一個特殊的用于連接文檔和圖形元素之間關(guān)系的對象,用于表示文檔的一個頁。進(jìn)一步修改或擴(kuò)充一下這個軟件,就可以很容易地得到一個包含了多個頁的圖形編輯軟件。在軟件的設(shè)計過程中,這個對象的引入,極大地將低了文檔類的設(shè)計難度。它使得很多原來被分配到文檔類中的方法被轉(zhuǎn)移到復(fù)合類中,極大地簡化了文檔類的設(shè)計。并使軟件具有了更清晰的結(jié)構(gòu)和更好的可擴(kuò)充性。13.3.3圖形文檔類的設(shè)計4.復(fù)合元素類的設(shè)計復(fù)合元素類的方法包括圖形元素的添加、刪除和修改等元素管理方面的操作。還包括圖層操作、序列化操作、選擇和移動等操作。表13-3復(fù)合元素類的主要操作序號方法說明1voidAdd(CGraphicsElement*p);添加元素2voidInsert(intindex,CGraphicsElement*pElement);插入元素3CGraphicsElement*Remove(inti);刪除指定元素

4intRemove(CGraphicsElement*pElement);5intReplaceWith(CGraphicsElement*O,CGraphicsElement*N);替換元素6voidSwapeElement(inti,intj);交換兩元素位置7booleanBringToFront(CGraphicsElement*p,inti);圖層操作

8booleanSetToBottom(CGraphicsElement*p,inti);9booleanBringToPrevious(CGraphicsElement*p,inti);10booleanSetToNext(CGraphicsElement*p,inti);11virtualvoidSerialize(CArchive&ar);序列化12virtualvoidDraw(CDC*pDC);繪制13CGraphicsElement*SelectElement(CPointpoint);選擇元素14CGraphicsElement*SelectElement(CRectrect);15voidMove(CSizeoffset);移動圖形元素16CCompositeElement*CreateCommposite(CElementGroup*p);生成復(fù)合元素17virtualCCompositeElement*Clone();克隆操作18virtualenumPointAtPointAt(CPointp,HCURSOR&h);檢索鼠標(biāo)位置13.3.3圖形文檔類的設(shè)計5.文檔類的設(shè)計從邏輯上看,本軟件的文檔對象可以視為圖形元素構(gòu)成的集合。從物理結(jié)構(gòu)的角度,文檔對象則被定義成若干個頁(page)構(gòu)成的集合,每個頁又可以看成是一個由多個圖形元素構(gòu)成集合。為了實現(xiàn)這樣的物理結(jié)構(gòu),在文檔類(CGraphicsDocument)對象中組合了一個頁(CPage類)對象集合,其中的每個CPage類對象又被設(shè)計成組合元素類的一個派生類。這樣的設(shè)計為文檔結(jié)構(gòu)提供了一個清晰的層次結(jié)構(gòu)。在任何時刻,用戶所看到的元素均呈現(xiàn)出組合和元素這樣的層次結(jié)構(gòu),既符合用戶的邏輯思維習(xí)慣,又便于軟件的具體實現(xiàn)。圖13-9描述了這樣一個文檔類的設(shè)計。其中的CGraphicsDocument類就是這個文檔類。13.3.3圖形文檔類的設(shè)計5.文檔類的設(shè)計圖13-9文檔類的結(jié)構(gòu)13.3.3圖形文檔類的設(shè)計5.文檔類的設(shè)計CGraphicsDocument類中,defFigureProperties、defPictureProperties、defTextProperties和defLineProperties等四個屬性表示圖形元素的默認(rèn)非幾何元素屬性。建立新圖形元素時,這些屬性的值將作為新圖形元素的缺省屬性。圖中的CPage類就是所謂的頁,它是復(fù)合文檔元素類(CConmpositElement)的一個派生類。不同的是,頁具有相對固定的大小,而復(fù)合文檔元素的大小則是可變的,其具體的大小與其內(nèi)容有關(guān)。CGraphicsElement這時圖形元素類。由于文檔類對象在邏輯上被視為若干個圖像元素構(gòu)成的集合,因此,其主要的方法就應(yīng)該是為組織、管理和存儲它所擁有的所有圖形元素提供外部服務(wù)。13.3.3圖形文檔類的設(shè)計5.文檔類的設(shè)計可以對用例進(jìn)行動態(tài)建模,如使用活動圖、狀態(tài)圖、順序圖或通訊圖建模,找出文檔對象承擔(dān)的職責(zé),可以找出文檔類中應(yīng)有的方法了。例如,對于保存文檔功能,可以使用動態(tài)模型對保存過程進(jìn)行建模,這樣就可以為文檔類及其相關(guān)類找到相應(yīng)的職責(zé)。圖13-10的順序圖就描述了保存文檔過程的參與者及其它們之間的交互。13.3.3圖形文檔類的設(shè)計5.文檔類的設(shè)計圖13-10保存文檔過程13.3.3圖形文檔類的設(shè)計序號方法說明1virtualvoidSerialize(CArchive&ar);序列化圖形元素2intAdd(CGraphicElement*pElement);添加圖形元素3intDelete(CGraphicElement*pElement);刪除圖形元素4voidInsertTo(intindex,CGraphicElement*pElement);插入圖形元素5voidDraw(CDC*pDC);顯示圖形元素6intGetItemCount();返回文檔元素個數(shù)7CGraphicElement*SelectElement(CPointpoint,int&Index);按位置查找圖形元素8intSwapeElement(intOrgin,intNew);交換圖形元素9intGetWidth();返回畫布寬度10intGetHeight();返回畫布高度11intReplace(CGraphicElement*O,CGraphicElement*N);替換圖形元素表13-3文檔類的主要方法13.3.4視圖類設(shè)計在MFC文檔視圖結(jié)構(gòu)的程序框架中,視圖承擔(dān)了用戶與文檔對象之間的最重要的橋梁,視圖對象負(fù)責(zé)向用戶顯示文檔的內(nèi)容和狀態(tài),甚至還可以向用戶展示用戶與系統(tǒng)之間的交互過程。同時,視圖對象還負(fù)責(zé)接受用戶的操作請求,并將這些用戶請求轉(zhuǎn)交給文檔對象。因此,視圖對象的設(shè)計是基于文檔視圖結(jié)構(gòu)的程序框架中最具有挑戰(zhàn)性的部分。13.3.4視圖類設(shè)計1.屬性定義1)視圖狀態(tài)ViewStatusmViewStatus;其中,mViewStatus是一個枚舉類型的變量,用于表示視圖的當(dāng)前狀態(tài)。其具體的值被定義為{NORMAL,CREATE,CREATING,TEXTEDIT,SELECTED,MULTISELECTED,MOVING}等。2)對象類型:KindsOfElementCurrentElementClass;其中的CurrentElementClass是一個枚舉型變量,用于表示創(chuàng)建圖形元素時,用戶選擇的圖形元素類型。其具體的取值為{enumNone,enumLine,enumRectangle,enumPolyRectangle,enumText,enumEllipse,enumPicture};3)窗口范圍和視口范圍intstartx,starty;intxWinExt,yWinExt,xViewExt,yViewExt; 它們分別表示視圖對象的視口原點、窗口范圍和視口范圍,用于實現(xiàn)圖形縮放操作。4) 命令列表CCommandListOperationList;命令列表對象,用于支持恢復(fù)和重做操作。13.3.4視圖類設(shè)計2.方法定義對于視圖類中的方法,這里僅討論軟件中我們自己添加的部分方法。而忽略框架生成的那些方法。1生成創(chuàng)建對象:根據(jù)與欲創(chuàng)建的圖素類型,生成一個具體的創(chuàng)建對象類實例。CCreateCommand*GenAnCreateOperation(ClassOfElementenumObject,HWNDhwnd,CPointpoint);2繪制函數(shù):這是一個在視圖類基類中定義的函數(shù),用于繪制文檔內(nèi)容。其具體實現(xiàn)是顯示文檔的內(nèi)容。virtualvoidOnDraw(CDC*pDC);3創(chuàng)建圖素對象:這是一組用于處理用戶創(chuàng)建圖素對象請求的函數(shù),每個函數(shù)對應(yīng)一種具體的圖素類型。在用戶界面上,也對應(yīng)了一組用戶界面元素(如命令按鈕和命令菜單等)。 這些函數(shù)包括:afx_msgvoidOnLine();//直線afx_msgvoidOnRectangle();//矩形afx_msgvoidOnPolyrectangle();//多邊形afx_msgvoidOnText();//文本afx_msgvoidOnEllipse();//橢圓afx_msgvoidOnPicture();//圖片13.3.4視圖類設(shè)計4Z序操作:用于修改圖形元素的Z序。afx_msgvoidOnPrivious();//上移一層afx_msgvoidOnNext();//下移一層afx_msgvoidOnTop();//移到頂層afx_msgvoidOnBottom();//移到最底層5縮放操作:用于放大和縮小圖形元素的顯示。afx_msgvoidOnSizedown();//縮小afx_msgvoidOnSizeup();//放大6屬性:用于修改圖形的非幾何屬性。afx_msgvoidOnProperty();//屬性13.3.4視圖類設(shè)計7鼠標(biāo)事件函數(shù):這是視圖類中最重要的四個函數(shù)。它們實現(xiàn)了圖13-11的狀態(tài)圖中大部分交互操作和幾乎所有的狀態(tài)變遷的控制。afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);afx_msgvoidOnLButtonDblClk(UINTnFlags,CPointpoint);8刪除圖形元素:afx_msgvoidOnDelete();9恢復(fù)和重做:用于支持恢復(fù)與重做。afx_msgvoidOnEdieRedo();afx_msgvoidOnEditUndo();13.3.4視圖類設(shè)計觀察這些函數(shù)時將會發(fā)現(xiàn),除了第一個函數(shù)之外,其余函數(shù)都是事件驅(qū)動函數(shù),即每個函數(shù)都對應(yīng)了一個特定的事件。而圖13-14中的狀態(tài)圖,并沒有完全涵蓋所有這些事件。當(dāng)然也沒有涵蓋視圖對象對這些事件的反應(yīng)。這也說明了,任何一個單獨的模型都只能是對軟件的概括性描述??偟膩碚f,這些方法應(yīng)該包括了前面所提到過的大多數(shù)軟件功能、用例和文檔結(jié)構(gòu)等方面的描述。13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝為了有效地管理軟件中定義的各種操作并進(jìn)行撤銷和恢復(fù),我們將用戶操作封裝成一個對象來加以實現(xiàn)。用戶每執(zhí)行一個操作,系統(tǒng)就創(chuàng)建一個對象來封裝用戶所完成的操作,同時按照操作進(jìn)行的順序保存好這些對象。當(dāng)用戶想要撤銷他剛剛做過的操作時,系統(tǒng)就可以取出用戶剛剛完成的操作對象,執(zhí)行這個操作的逆操作。圖13-11用戶命令類設(shè)計13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝其中Command類為所有命令類的基類,它為所有命令對象提供了一個統(tǒng)一的接口。接口的主要內(nèi)容包括Undo()和ReDo()兩個操作。通過這個接口,可以實現(xiàn)用戶命令的撤銷和重做。CCommandList類可以看成是命令的一個聚合,用于保存軟件運(yùn)行過程中產(chǎn)生的操作對象。CommandList被定義成一個雙棧結(jié)構(gòu)的命令列表,里面保存了兩個棧,分別存放剛剛執(zhí)行過的操作和剛剛撤銷的用戶操作。系統(tǒng)通過訪問這兩個棧里的操作,分別實現(xiàn)撤銷和重做這兩個操作。圖中還展示了創(chuàng)建(CCreateCommand)、刪除(CDeleteCommand)、修改(CModifyCommand)、移動(CMoveCommand)、編輯(CTextEditCommand)、Z序(CZOrderCommand)、組合(CGroupCommand)、解組(CUnGroupCommand)和屬性(CPropertyCommand)等多個命令類的派生類。這些派生類在實現(xiàn)了CCommand接口的基礎(chǔ)上,又增加了各自不同的操作。其中創(chuàng)建對象命令(CCreateCommand)和移動(CMoveCommand)又依照其操作的對象的類型的不同又被分成多種不同的情況。13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖13-12中的類圖描述了所有創(chuàng)建對象命令(CCreateCommand)類的結(jié)構(gòu)。其中,CCreateRectangle用于創(chuàng)建矩形對象。CCreateText用于創(chuàng)建矩形對象,CCreatePicture用于創(chuàng)建圖片對象,CCreateLine用于創(chuàng)建直線對象,CCreatePolyRectangle用于創(chuàng)建多邊形對象。CCreateEllipse用于創(chuàng)建橢圓對象。值得注意的是,CCreateComand類增加了一組用于支持交互式創(chuàng)建或修改圖形元素對象的方法。這樣,這些創(chuàng)建圖形元素的命令類就可以即支持撤銷和重做操作。同時,又可以在創(chuàng)建圖形元素的場景中,支持圖形元素對象的創(chuàng)建。13.3.5交互操作的結(jié)構(gòu)圖13-12創(chuàng)建對象命令類圖13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖13-13中的類圖描述了移動圖形元素命令(CMoveCommand)類及其派生類的結(jié)構(gòu)。其中,CMoveCommand對象用于移動文檔中某個圖形元素;CMoveFrameCommand對象用于移動圖形元素的邊框,這相當(dāng)于對內(nèi)部的圖形完成一次水平或垂直的拉伸變換,結(jié)果是改變了圖形的形狀;CMoveVertexCommand對象用于移動多邊形的特定頂點,結(jié)果是改變了多邊形的形狀;而CMoveEdgeCommand對象則用于移動多邊形的某條邊,來改變多邊形的形狀;13.3.5交互操作的結(jié)構(gòu)圖13-13移動圖形元素命令類圖13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖中的最后一個類,CMoveCommandGroup對象則用于移動一組圖形元素,它被設(shè)計成一組命令的集合。這樣的命令可以稱之為宏命令。執(zhí)行時,首先為每個選中的圖形元素生成一個移動命令,再將這些命令組合成一個宏命令,在執(zhí)行這個宏命令的Do方法,即逐個執(zhí)行其中的子命令。當(dāng)然,撤銷時,也是執(zhí)行宏命令的UnDo方法,即逐個地執(zhí)行每個命令的Undo命令。從而撤銷對一組對象的移動。13.3.5交互操作的結(jié)構(gòu)2.命令對象的創(chuàng)建系統(tǒng)運(yùn)行過程中,每個操作都是由用戶的操作意圖決定的。用戶需要將其操作意圖轉(zhuǎn)換成操作的前置條件。在指定前置條件下,一旦發(fā)生了特定的用戶事件,則系統(tǒng)就會創(chuàng)建指定的命令對象并開始一個交互過程,在這個過程中與用戶交互,實現(xiàn)用戶的操作意圖。值得注意的是,在這個交互過程中,每一個動作都應(yīng)該使系統(tǒng)處于某種一致性的狀態(tài)。

表13-4列出了圖形元素操作過程中需要識別的條件、用戶事件以及后續(xù)要完成的操作。所有這些要素就構(gòu)成了設(shè)計和實現(xiàn)這些交互操作的重要基礎(chǔ)。表13-4創(chuàng)建交互命令對象的前置條件和用戶事件用戶的操作意圖前置條件用戶事件創(chuàng)建的命令對象類型創(chuàng)建矩形圖形元素選擇矩形單擊編輯區(qū)CCreateRectangle創(chuàng)建文本圖形元素選擇文本單擊編輯區(qū)CCreateText創(chuàng)建圖片圖形元素選擇圖片單擊編輯區(qū)CCreatePicture創(chuàng)建線段圖形元素選擇線段單擊編輯區(qū)CCreateLine創(chuàng)建多邊形圖形元素選擇多邊形單擊編輯區(qū)CCreatePolyRectangle創(chuàng)建橢圓矩形圖形元素選擇橢圓單擊編輯區(qū)CCreateEllipse移動圖形元素選擇圖形元素鼠標(biāo)移動事件CMoveCommand移動邊框選擇圖形元素邊框鼠標(biāo)移動事件CMoveFrameCommand移動多邊形的頂點選擇多邊形的頂點鼠標(biāo)移動事件CMoveVertexCommand移動多邊形的邊選擇多邊形的邊鼠標(biāo)移動事件CMoveEdgeCommand刪除圖形元素選擇了某個圖形元素發(fā)生Del鍵盤事件CDeleteCommand修改圖形元素顯示順序選擇了某個圖形元素修改Z序事件CZOrderCommand組合復(fù)合圖素選擇了多個圖形元素發(fā)生組合命令事件CGroupCommand解組復(fù)合圖形元素選擇了某個復(fù)合元素發(fā)生解組命令事件CUnGroupCommand修改圖形非幾何屬性選擇了某個圖形元素發(fā)生屬性命令事件CPropertyCommand13.3.5交互操作的結(jié)構(gòu)2.命令對象的創(chuàng)建下面以實現(xiàn)創(chuàng)建圖形元素為例,說明一下如何實現(xiàn)創(chuàng)建圖形元素對象操作。我們使用了工廠方法模式實現(xiàn)了上述過程中的創(chuàng)建圖形對象操作。其具體實現(xiàn)方法是:首先,在視圖類中,定義了一個狀態(tài)變量表示欲創(chuàng)建的圖形元素類型。ClassOfElementCurrentElementClass;其中,ClassOfElement是一個枚舉類型,其具體定義如下:typedefenum{none,sLine,sRectangle,sPolyRectangle,sText,sEllipse,sPicture}ClassOfElement;其次,在CGraphicsView類中定義了一個名為GenAnCreateOperation的工廠方法,用于創(chuàng)建具體的創(chuàng)建命令對象。13.3.5交互操作的結(jié)構(gòu)這個方法的代碼如下。CCreateCommand*CGraphicsView::GenAnCreateOperation(ClassOfElementenumObject,HWNDhwnd,CPointpoint){ CGraphicsDocument*pDoc=GetDocument(); ASSERT_VALID(pDoc); CElemtentProperties*p=newCElemtentProperties(); switch(enumObject) { casesLine: returnnewCCreateLine(pDoc,hwnd,point,p); casesRectangle: returnnewCCreateRectangle(pDoc,hwnd,point,p); casesPolyRectangle: returnnewCCreatePolyRectangle(pDoc,hwnd,point,p); casesText: returnnewCCreateText(pDoc,hwnd,point,p); casesPicture: returnnewCCreatePicture(pDoc,hwnd,point,p); casesEllipse: returnnewCCreateEllipse(pDoc,hwnd,point,p); } returnNULL;}13.3.5交互操作的結(jié)構(gòu)3.創(chuàng)建圖形元素的交互過程由于系統(tǒng)中定義了多種不同類型的圖形元素,而且創(chuàng)建不同圖形元素的交互過程也不盡相同,因此,創(chuàng)建圖形元素對象的過程一定是一個復(fù)雜的過程。如果為每種不同的元素定義不同的交互過程,將不可避免地增加系統(tǒng)的復(fù)雜性,同時這樣的設(shè)計也不利于系統(tǒng)的擴(kuò)充和維護(hù)。因此,設(shè)計一個可以用于不同類型的元素的創(chuàng)建的過程就成為一個優(yōu)先考慮的選擇。這里,我們在充分考慮不同類型的圖形元素的基礎(chǔ)上,設(shè)計了如下的創(chuàng)建抽象圖形元素的過程。創(chuàng)建圖形元素對象的操作過程可以簡單地描述如下:1選擇圖形元素類型,如直線、矩形、橢圓、多邊形、文本和圖片等類型。2依次輸入圖形元素的各頂點坐標(biāo)。2.1將鼠標(biāo)指針移動到圖形元素的起始位置按下鼠標(biāo),系統(tǒng)將創(chuàng)建一個圖形元素對象。2.2用戶將鼠標(biāo)拖動到圖形元素的下一個頂點位置,釋放鼠標(biāo),系統(tǒng)將該坐標(biāo)值設(shè)置成創(chuàng)建對象的第二個頂點坐標(biāo)值。2.3若用戶沒有為當(dāng)前圖形元素輸入足夠的頂點坐標(biāo),則用戶可單擊鼠標(biāo)輸入下一個坐標(biāo)位置,每點擊一次輸入一個頂點坐標(biāo)。直到用戶雙擊鼠標(biāo)為止。3將當(dāng)前對象插入到當(dāng)前復(fù)合對象中。4結(jié)束。13.3.5交互操作的結(jié)構(gòu)圖13-14創(chuàng)建圖形元素對象的過程13.3.5交互操作的結(jié)構(gòu)3.創(chuàng)建圖形元素的交互過程雖然,創(chuàng)建不同類型的圖形元素對象時,其具體的執(zhí)行過程是不盡相同的。但圖13-14中的順序圖卻展示了一個比較抽象或一致的過程,這個過程涵蓋了創(chuàng)建各種圖形元素所需要的過程。對于直線、矩形和橢圓等具有固定頂點個數(shù)的圖形元素對象來說,這些對象可以根據(jù)輸入的頂點個數(shù)判斷創(chuàng)建過程的進(jìn)展,進(jìn)而完成對象的創(chuàng)建。而對于多邊形來說,由于其頂點個數(shù)不是事先確定的。因此,它需要定義一個專門的事件(如鼠標(biāo)雙擊事件),來確定何時結(jié)束多邊形頂點的輸入過程,我們在頂點輸入過程中引入了這樣的一個事件。而對于不需要這個事件的創(chuàng)建過程,例如橢圓等元素的控制點輸入過程,則直接忽略了這個事件。13.3.5交互操作的結(jié)構(gòu)3.創(chuàng)建圖形元素的交互過程再例如,創(chuàng)建圖片(Picture)和文本(Text)對象時,在輸入完圖形元素的頂點坐標(biāo)之后,還需要一個輸入圖片文件名或文本內(nèi)容等信息的編輯過程,我們也在創(chuàng)建圖形元素對象過程中加入了這樣一個編輯操作,而對于不需要這種編輯操作的創(chuàng)建過程來說,則通過空操作的方式忽略了這個編輯操作。這樣,我們建立了一個統(tǒng)一或一致的過程,這個過程兼容了問題的各種不同情況,解決了這個過程的復(fù)雜性問題。在最終的實現(xiàn)方案中,系統(tǒng)在其視圖類的創(chuàng)建對象過程的代碼中,僅使用CCreateCommand接口就實現(xiàn)了圖形元素對象的創(chuàng)建,這樣的方式有效地簡化了視圖類的程序代碼。這也符合了里氏代換原則,雖然這樣的程序代碼比較抽象,但它更簡潔、也更有利于系統(tǒng)的擴(kuò)充和維護(hù)。13.4動態(tài)建模考慮如何實現(xiàn)前面定義的各種操作(見表13-1)。軟件中的任何操作都可以看成是通過軟件中的某些對象之間的一系列交互實現(xiàn)的。全景式的過程建模通常是不存在的,過程建模的粒度通??梢允怯美⒂美龍鼍盎騽幼鳛閱挝粊磉M(jìn)行的。而且,用例動態(tài)建模應(yīng)盡可能簡單明了。即建模的目的是簡化模型而不是故意使問題更加復(fù)雜。UML主要通過活動圖、狀態(tài)圖、時序圖和通訊圖等四種模型建模軟件的動態(tài)行為。對于活動圖來說,活動圖主要用于在較高的抽象層次上,描述某個過程,如業(yè)務(wù)流程、用例等。前面我們已經(jīng)給出了幾個活動圖建模的例子(如圖13-8和圖13-9等)。這些活動圖圖所反映的僅僅是從用戶視角看到的一個比較概括的操作過程。它們的作用往往用于說明從用戶的角度看到的操作過程。下面我們將分別使用順序圖、通訊圖和狀態(tài)圖的幾個例子來說明這些模型的作用。13.4.1順序圖建模順序圖通常用于描述一個用例(操作)或用例中的特定場景,如果希望完整地描述一個用例,有時可能需要繪制多張順序圖。順序圖建模有助于找到實現(xiàn)一個用例所需要的角色以及每個角色中所包含的方法。從概念上來說,角色可以看成是一組相關(guān)的方法的集合。對于一個具體的順序圖來說,角色可能是一個抽象的角色,也可能是一個具體的對象、類或接口等。最終,這些角色將被落實到系統(tǒng)的結(jié)構(gòu)中。圖中的每個消息則可以落實成對應(yīng)角色的具體方法。13.4.1順序圖建模下面,我們使用一張更細(xì)化的順序圖(圖13-15)來描述一下創(chuàng)建圖形元素對象的過程。從圖13-15可以得到的信息包括:參與圖形元素創(chuàng)建過程的角色、方法以及方法的守衛(wèi)條件等。這樣一個描述顯然更具體或更接近于目標(biāo)系統(tǒng)。還有一個問題是前面提到過的多邊形的創(chuàng)建問題。圖13-15中則給出了這個問題的更具體的解決辦法。13.4.1順序圖建模圖13-15創(chuàng)建圖形元素過程13.4.1順序圖建模從圖13-15可以獲得的信息包括:1實現(xiàn)創(chuàng)建圖形元素過程所需要的角色以及這些角色之間的關(guān)系從圖13-15中的順序圖可以看出,實現(xiàn)這個過程至少需要包括:用戶(User)、視圖(CGraphicsView)、創(chuàng)建命令對象(CCreateCommand)、圖形元素對象(CGraphicElement)、文檔對象(CGraphicsDocument)和操作命令列表(CCommandList)等多種不同的對象,以及這些對象之間應(yīng)具有的關(guān)聯(lián)關(guān)系。如果將圖13-15轉(zhuǎn)換成通訊圖,這可以更直觀地看出這些對象之間的鏈接關(guān)系,實際上這相當(dāng)于找到了這些類之間的關(guān)聯(lián)關(guān)系。13.4.1順序圖建模2對象之間傳遞的消息圖中每個對象所接收到的消息集合代表了這個對象所充當(dāng)?shù)囊环N角色。一個對象收到的所有消息相當(dāng)于這個角色在這個場景中需要的接口。例如,上圖中,CCreateCommand接收到的消息就包括了AddPoint(CPointpoint)、Complete()、SetComplete()和CreateObject()等四個消息。這四個消息不一定是CCreateCommand對象的所有操作,但一定是CCreateCommand對象在這張圖所描述的場景中所需要實現(xiàn)的一個接口。當(dāng)建模了足夠多的順序圖之后,就可能獲得同一個對象所充當(dāng)?shù)亩喾N不同角色,從而為這個類設(shè)計出更多的方法或所有的方法。13.4.1順序圖建模3參與者與系統(tǒng)之間的交互最后一個問題是,圖中的參與者User與CGraphicsView類之間的交互。例如,參與者User向CGraphicsView對象發(fā)出了的消息。由于User是一個參與者,即系統(tǒng)的外部實體,這兩者之間的交互代表的是系統(tǒng)與外部實體之間的交互,這些交互描述的是交互界面的設(shè)計要素。這些要素可以映射成各種外部事件,這些事件也對應(yīng)了CGraphicsView類的某些事件函數(shù),也對應(yīng)了系統(tǒng)需要的用戶界面元素(如菜單命令、命令按鈕和圖形屬性面板的設(shè)計等)以及這些用界面元素和事件函數(shù)之間的映射等。當(dāng)建模比較充分時,這可能會幫助我們獲得更為完整的設(shè)計。13.4.2通訊圖建模通訊圖與順序圖是一種語義等價的動態(tài)模型,使用它們可以獲得相同的建模增量。圖13-16給出了與順序圖(圖13-15)等價的通訊圖。圖13-16創(chuàng)建圖形元素過程的通訊圖表示13.4.1順序圖建模與順序圖不同的是,通訊圖中顯式地增加了類之間的關(guān)聯(lián)(或?qū)ο笾g的鏈接)。這為類的設(shè)計提供了更直觀的設(shè)計提示。要想從順序圖的建模獲得同樣的信息(類之間的關(guān)聯(lián)或?qū)ο笾g的鏈接),還需要建模人員進(jìn)行比較細(xì)致的分析。如順序圖(圖13-15)中并沒有直接出現(xiàn)類之間的關(guān)聯(lián)或?qū)ο笾g的鏈接。分析順序圖中的對象之間的傳遞的消息,有消息傳遞的類或?qū)ο笾g就應(yīng)該擁有用于傳遞這些消息的關(guān)聯(lián)或鏈接。同樣,順序圖中也沒有直接出現(xiàn)在通訊圖中的消息編號,但分析順序圖中消息的發(fā)生順序、類型和消息之間的嵌套,同樣可以得到準(zhǔn)確的消息編號。從而得到等價的通訊圖。13.4.1順序圖建模通訊圖的建模過程與順序圖建?;绢愃疲谕贿^程的順序圖模型已經(jīng)存在的情況下,自動轉(zhuǎn)換也是一個高效率的選擇。最后要說的是,雖然這兩種圖是語義等價的,它們在視覺上帶給人的直觀感受和信息卻都是不一樣的,繪制出其中的任何一種表示就可以很容易地借助建模工具得到它的另一種表示,這可以極大地提高建模的工作效率。另外,如果各自獨立地使用不同模型對同一過程進(jìn)行建?;蛟S會起到相互檢查和相互校驗的作用。13.4.3狀態(tài)圖建模動態(tài)建模過程中,除了使用交互圖建模以外,還有一種重要的模型就是狀態(tài)圖。本軟件中充斥了大量的復(fù)雜的交互式圖形操作,而這些復(fù)雜的交互操作往往是以簡單的鼠標(biāo)和鍵盤操作為基礎(chǔ)實現(xiàn)的。這為軟件的設(shè)計與實現(xiàn)均帶來了一定的難度。一個簡單清晰的狀態(tài)模型將可以幫助我們有效地控制好系統(tǒng)的復(fù)雜度。因此,狀態(tài)模型也是簡化本軟件設(shè)計的一個非常關(guān)鍵的問題。狀態(tài)圖的主要用于完整描述一個復(fù)雜對象的可能狀態(tài)以及狀態(tài)變遷時所表現(xiàn)的行為。一個建模充分的狀態(tài)圖可以有效降低后續(xù)的程序設(shè)計的設(shè)計難度,并盡可能避免程序設(shè)計中可能出現(xiàn)的結(jié)構(gòu)性錯誤問題。13.4.3狀態(tài)圖建模視圖(CGraphicsView)對象的狀態(tài)圖建模根據(jù)軟件的需求模型,將視圖對象的狀態(tài)定義成:正常、創(chuàng)建、編輯、修改和移動等五種狀態(tài)。這些狀態(tài)的具體定義如下:1NORMAL狀態(tài)表示視圖對象的初始狀態(tài),此狀態(tài)下沒有被選中的圖形元素和有待進(jìn)行的下一步操作。此時,用戶可以創(chuàng)建(CREATE)新元素,也可以選擇現(xiàn)有元素,以便于移動(MOVING)或修改(MODIFY)選中的操作。2CREATE狀態(tài)表示開始創(chuàng)建圖形元素對象的狀態(tài)。在此狀態(tài)下,用戶可以輸入要創(chuàng)建圖形元素的起始點。輸入完后,視圖將自動進(jìn)入編輯(EDIT)狀態(tài),以最終完成圖形的創(chuàng)建。13.4.3狀態(tài)圖建模3EDIT狀態(tài)表示編輯新創(chuàng)建的圖形元素的各個點坐標(biāo)和其它屬性的狀態(tài)。如對于文本(CText)對象來說,需要輸入第二個坐標(biāo)點;而對于圖形(CPicture)對象來說,則要輸入圖形文件。用戶完成圖形元素的編輯之后,創(chuàng)建的圖形元素保持被選中狀態(tài),視圖將進(jìn)入修改(MODIFY)狀態(tài)。4MODIFY狀態(tài)表示系統(tǒng)中有圖形元素被選中的狀態(tài)。此狀態(tài)下,用戶可以修改圖形元素。5MOVING狀態(tài)表示被選中的圖形元素處于被拖動中的狀態(tài)。此狀態(tài)下,用戶可以移動或修改圖形元素。圖13-17視圖對象的狀態(tài)圖13.4.3狀態(tài)圖建模圖13-17給出了視圖對象的狀態(tài)圖模型,圖中的狀態(tài)可以映射成視圖類的成員變量,定義的這些狀態(tài)為這個成員變量的取值范圍。圖中的每個遷移都包含了條件、事件和對應(yīng)的動作。例如,對于下面的遷移表達(dá)式:Move(point)[pElement!=NULL]/Pt=PointAT(point);SetCoursor(LoadCourse(PT));其中的Move(point)是一個事件,表示鼠標(biāo)移動到point點;[pElement!=NULL]是遷移的警戒條件。最后,Pt=PointAT(point);SetCoursor(LoadCourse(PT));是一個動作序列,含義是計算鼠標(biāo)指向選中的圖形元素的控制點的具體位置,這個位置決定了下一步要對圖形元素進(jìn)行的具體操作,如改變大小和移動等。整個遷移表達(dá)式完整地描述了這個遷移的事件、條件和相應(yīng)的動作序列。13.4.3狀態(tài)圖建模整個狀態(tài)圖完整地描述了視圖對象的狀態(tài)和狀態(tài)之間的變遷,還描述了每個狀態(tài)遷移的事件、條件和相關(guān)的動作等內(nèi)容。讀者可以仔細(xì)對照一下此圖與程序代碼之間的關(guān)系,可以看出模型和程序代碼之間的對應(yīng)關(guān)系。也可以看出在編寫程序之前,為復(fù)雜的對象設(shè)計一個好的狀態(tài)模型對程序設(shè)計所起到的獨特作用。由于目前的大多數(shù)建模工具均不支持狀態(tài)機(jī)模型到應(yīng)用程序之間的直接轉(zhuǎn)換,因此,狀態(tài)圖到程序代碼的映射只能以人工的方式進(jìn)行。盡管如此,大量的實踐表明,建模充分的狀態(tài)機(jī)模型仍可以有效地幫助我們提高程序的開發(fā)效率和質(zhì)量。UML的活動圖、狀態(tài)圖、順序圖和通訊圖等分別描述了一個軟件的不同側(cè)面,它們一起構(gòu)成了一個完整的軟件模型。13.5建模的抽象層次

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論