版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第13章面向?qū)ο蠓治鲈O(shè)計(jì)案例學(xué)習(xí)目標(biāo)
通過案例鞏固和加強(qiáng)對(duì)軟件開發(fā)過程中用例模型的作用和建模方法的理解
加強(qiáng)對(duì)軟件結(jié)構(gòu)模型設(shè)計(jì)過程和方法的理解,加強(qiáng)對(duì)概念模型及其獲取方法的理解
理解應(yīng)用程序架構(gòu)在軟件設(shè)計(jì)中的地位、作用及其應(yīng)用方法
理解動(dòng)態(tài)建模在軟件設(shè)計(jì)過程中的作用和使用方法第13章面向?qū)ο蠓治鲈O(shè)計(jì)案例為了更直觀有效地幫助讀者理解和掌握面向?qū)ο蟮姆治雠c設(shè)計(jì)方法,本章將給出一個(gè)完整的“交互式圖形編輯軟件”的分析和設(shè)計(jì)案例。案例內(nèi)容涵蓋了期望這個(gè)案例可以為讀者加深對(duì)面向?qū)ο蠓治龊驮O(shè)計(jì)領(lǐng)域的概念、方法和技術(shù)等學(xué)習(xí)提供有效的幫助。13.1軟件概述交互式圖形編輯軟件是一個(gè)運(yùn)行在Windows系統(tǒng)下的簡(jiǎn)單的圖文編輯軟件,其主要功能是編輯一個(gè)以直線、矩形、多邊形、橢圓、圖片以及文本等多種基本圖形元素構(gòu)成的圖形文檔。這個(gè)軟件的主要用途是作為一個(gè)教學(xué)軟件。教學(xué)過程中,可以將軟件視為一個(gè)實(shí)驗(yàn)素材,讀者可以閱讀這個(gè)軟件的全部?jī)?nèi)容(如系統(tǒng)分析、設(shè)計(jì)以及程序源碼等全部資料),也可以根據(jù)自己的興趣修改和擴(kuò)充這個(gè)軟件,從而幫助讀者學(xué)習(xí)和理解面向?qū)ο蠓治龊驮O(shè)計(jì)方面的內(nèi)容。13.1軟件概述本軟件的目的決定它只有一個(gè)用戶角色。使用時(shí),期望讀者從開發(fā)者的視角來討論和研究本案例中的分析和設(shè)計(jì)問題。為了更好的幫助初學(xué)者學(xué)習(xí),本案例不僅給出了軟件的分析和設(shè)計(jì)方面的描述,還給出了軟件的全部源代碼。通過閱讀這些源代碼,讀者可以從分析、設(shè)計(jì)與實(shí)現(xiàn)等多個(gè)角度來分析和討論問題。最后要說明的問題是,本軟件僅僅是一個(gè)簡(jiǎn)單的學(xué)習(xí)軟件,任何人都可以隨意使用這個(gè)人軟件的全部?jī)?nèi)容。另外,由于受到時(shí)間和技術(shù)能力等因素的限制,軟件中一定能會(huì)存在著各種各樣的缺點(diǎn)、缺陷甚至是錯(cuò)誤。對(duì)這方面的問題,敬請(qǐng)讀者諒解,也歡迎讀者給予批評(píng)和指正。本章將分別討論本案例的分析、設(shè)計(jì)和實(shí)現(xiàn)方案。13.2軟件功能結(jié)構(gòu)由于交互式圖形編輯軟件僅是一個(gè)用于創(chuàng)建由直線、矩形、多邊形和文本等圖形元素為構(gòu)成要素的數(shù)據(jù)文檔的圖形軟件。所以這個(gè)軟件僅有一個(gè)參與者,我們稱之為用戶。軟件用例的主要內(nèi)容也就是編輯圖形文檔所需要的各項(xiàng)功能。13.2.1主要參與者由于交互式圖形編輯軟件僅是一個(gè)用于創(chuàng)建由直線、矩形、多邊形和文本等圖形元素為構(gòu)成要素的數(shù)據(jù)文檔的圖形軟件。所以這個(gè)軟件僅有一個(gè)參與者,我們稱之為用戶。軟件用例的主要內(nèi)容也就是編輯圖形文檔所需要的各項(xiàng)功能。13.2.2用例模型用例分類用例名稱說明文檔操作創(chuàng)建文檔創(chuàng)建一個(gè)新的數(shù)據(jù)文檔文件,此數(shù)據(jù)文檔文件中沒有任何數(shù)據(jù)打開文檔打開一個(gè)已經(jīng)存在的數(shù)據(jù)文檔文件。并將文檔數(shù)據(jù)顯示在屏幕上保存文檔將當(dāng)前文檔保存到磁盤文件中打印文檔將當(dāng)前文檔輸出到指定的打印設(shè)備圖素操作
插入圖素向當(dāng)前文檔中插入一個(gè)指定的圖形元素選擇圖素將指定的圖形元素設(shè)置為選中狀態(tài)刪除圖素將選定圖形元素從當(dāng)前文檔中刪除改變位置將選定圖形元素從當(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)成的集合,文檔操作是將整個(gè)文檔作為操作對(duì)象進(jìn)行處理的操作。這種操作的前置條件是已經(jīng)存在了一個(gè)或多個(gè)文檔對(duì)象。1)創(chuàng)建文檔用例用例名:創(chuàng)建文檔用例描述:創(chuàng)建一個(gè)新的文檔對(duì)象。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:創(chuàng)建了一個(gè)新的文檔對(duì)象,同時(shí)創(chuàng)建并打開一個(gè)新的文檔窗口,并把軟件的當(dāng)前狀態(tài)置于新文檔的初始狀態(tài)。用例的事件流:1. 用戶選擇創(chuàng)建新文檔命令。2. 創(chuàng)建一個(gè)文檔對(duì)象及相應(yīng)的文檔窗口對(duì)象,并把這個(gè)文檔對(duì)象置為當(dāng)前文檔對(duì)象。13.2.2用例描述2)打開文檔用例用例名:打開文檔用例描述:打開一個(gè)已經(jīng)存在的文檔文件。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:打開一個(gè)已經(jīng)存在的文檔文件,創(chuàng)建一個(gè)新的文檔窗口,并在這個(gè)文檔窗口中顯示這個(gè)文檔內(nèi)容,同時(shí)把系統(tǒng)至于就緒狀態(tài)。用例的事件流:1.用戶選擇打開文檔命令。2.系統(tǒng)提示用戶輸入文件名。3.系統(tǒng)將檢查文件的存在性以及合法性。若文件不存在,則提示文件名輸入錯(cuò)誤,并將系統(tǒng)返回到先前的狀態(tài)。4.系統(tǒng)打開這個(gè)文件并對(duì)文件進(jìn)行合理性檢查,若文件類型非法,則提示用戶文件類型錯(cuò)誤,并將系統(tǒng)返回到先前的狀態(tài)。否則系統(tǒng)讀入并顯示這個(gè)文件的內(nèi)容。13.2.2用例描述3)保存文檔用例用例名:保存文檔用例描述:將當(dāng)前文檔的內(nèi)容保存到指定的磁盤文件中。參與者:用戶前置條件:當(dāng)前文檔非空,即當(dāng)前文檔是一個(gè)含有圖形元素的文檔。后置條件:當(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)前文檔是一個(gè)含有圖形元素的文檔。后置條件:創(chuàng)建了一個(gè)新的文檔對(duì)象,同時(shí)創(chuàng)建并打開一個(gè)新的文檔窗口,并把軟件的當(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)前文檔對(duì)象中,并更新了當(dāng)前文檔的顯示。用例的事件流::1用戶選擇修改畫布操作命令。2輸入畫布參數(shù)并確認(rèn)。3系統(tǒng)刷新圖形的顯示13.2.2用例描述6)修改圖素Z序此操作是一個(gè)比較特殊的操作,其含義是改變圖形元素的Z軸方向的位置。其主要特點(diǎn)是不改變圖形元素本身的狀態(tài)。改變的僅僅是其顯示位置而已。用例名:修改圖素Z序用例描述:修改指定圖形元素的Z序參與者:用戶前置條件:選擇了合適的圖形元素。后置條件:將新的畫布參數(shù)保存到當(dāng)前文檔對(duì)象中,并更新了當(dāng)前文檔的顯示。用例的事件流:1用戶選擇修改畫布操作命令。2輸入畫布參數(shù)并確認(rèn)。3系統(tǒng)刷新圖形的顯示。13.2.2用例描述2.圖素操作1)插入圖素用例名:插入圖素用例描述:向當(dāng)前文檔中插入一個(gè)特定的圖形元素。參與者:用戶前置條件:用戶已經(jīng)創(chuàng)建或打開了某個(gè)文檔。后置條件:向當(dāng)前文檔中插入了一個(gè)指定的圖素對(duì)象,并將軟件的當(dāng)前狀態(tài)置于正常狀態(tài)。用例的事件流:1選擇圖形元素類型。2輸入創(chuàng)建的圖形元素的位置等屬性13.2.2用例描述2)選擇圖素用例名:創(chuàng)建文檔用例描述:創(chuàng)建一個(gè)新的文檔對(duì)象。參與者:用戶前置條件:用戶已經(jīng)打開軟件系統(tǒng)。后置條件:將指定的圖形元素設(shè)置為選中狀態(tài)。用例的事件流:1用戶用鼠標(biāo)器單擊欲選擇的圖形元素2系統(tǒng)清除現(xiàn)有的圖形元素上的選中標(biāo)志。3系統(tǒng)查找出文檔中距離鼠標(biāo)位置最近的圖形元素,再檢查這個(gè)最近距離是否小于某個(gè)特定的臨界值。如果最近距離小于這個(gè)臨界值,則將這個(gè)圖形元素設(shè)置成被選中狀態(tài)。4刷新圖形元素的顯示。13.2.2用例描述3)修改圖素修改指定圖形元素的位置、大小、形狀等幾何屬性和顏色線條和刷等非幾何屬性的修改。修改圖素用例又可以分成移動(dòng)圖形元素的位置、大小、形狀和Z序等多種情況。用例名:修改圖素用例描述:修改指定圖形元素的幾何屬性和非幾何屬性的修改。參與者:用戶前置條件:用戶已經(jīng)選中了某個(gè)(或某些)圖形元素。后置條件:刷新了圖形顯示,使被修改的圖形以新的狀態(tài)顯示。并將修改結(jié)果保存在文檔對(duì)象中,并使系統(tǒng)處于一個(gè)合適的狀態(tài)。用例的事件流:1以適當(dāng)?shù)姆绞剑ㄈ缤蟿?dòng)、對(duì)話框以及文本輸入等)輸入圖形屬性的參數(shù)。2刷新圖形顯示。13.2.2用例描述3.撤銷恢復(fù)操作現(xiàn)代軟件中,撤銷恢復(fù)幾乎是所有編輯類軟件的標(biāo)準(zhǔn)操作了。因此,在這個(gè)軟件中自然也定義了這兩個(gè)操作。撤銷操作用于撤銷用戶最近剛剛執(zhí)行的操作,操作的結(jié)果是將文檔對(duì)象恢復(fù)到被撤銷操作執(zhí)行前的狀態(tài)。而恢復(fù)操作則是重新執(zhí)行剛剛被撤銷的操作。圖13-2抽象用例13.2.2用例描述4.剪貼板操作與撤銷恢復(fù)操作一樣,剪貼板操作也是現(xiàn)代軟件產(chǎn)品中不可或缺的重要組成部分。實(shí)現(xiàn)剪貼板操作的問題在于對(duì)剪貼板編程技術(shù)的掌握,其具體實(shí)現(xiàn)不在本教材中討論。13.2.3概念模型根據(jù)本軟件的目標(biāo)和特點(diǎn),我們定義了軟件的文檔結(jié)構(gòu),并將這個(gè)文檔結(jié)構(gòu)作為軟件的概念模型。圖13-3給出了這個(gè)軟件文檔的概念結(jié)構(gòu)。圖13-3文檔結(jié)構(gòu)的概念模型13.3軟件結(jié)構(gòu)設(shè)計(jì)在結(jié)構(gòu)設(shè)計(jì)階段,首先需要考慮的是如何將概念模型轉(zhuǎn)換成某種特定的開發(fā)環(huán)境支持的軟件結(jié)構(gòu)模型。本軟件使用MFC程序設(shè)計(jì)方法實(shí)現(xiàn),因此系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)必然與MFC程序設(shè)計(jì)技術(shù)具有密切的關(guān)系。本軟件將使用MFC的文檔視圖結(jié)構(gòu)作為程序的總體結(jié)構(gòu)框架。其次,到了這一階段就直接開始程序設(shè)計(jì)并不是一個(gè)好的開發(fā)方法。這樣不僅影響開發(fā)效率,而且軟件開發(fā)質(zhì)量也會(huì)受到嚴(yán)重影響。比較好的做法是,到了設(shè)計(jì)階段,還需要對(duì)軟件的動(dòng)態(tài)行為進(jìn)行更細(xì)致的建模,并通過動(dòng)態(tài)建模,不斷細(xì)化和完善系統(tǒng)的結(jié)構(gòu)模型。13.3.1MFC文檔視圖結(jié)構(gòu)簡(jiǎn)介圖13-4展示了MFC文檔視圖結(jié)構(gòu)的基本構(gòu)成。文檔視圖框架是一個(gè)由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)簡(jiǎn)介主窗口類(CMainframe)表示應(yīng)用程序的主窗口對(duì)象,它是整個(gè)程序的容器窗口。每個(gè)程序?qū)嵗彩怯星矣幸粋€(gè)主窗口對(duì)象。應(yīng)用程序中的子窗口、對(duì)話框、菜單、工具欄以及工具欄等,都是這個(gè)主窗口的子窗口對(duì)象。子框架窗口(CFrame)對(duì)象是主窗口(CMainframe)的子窗口,用于組織應(yīng)用程序的交互界面(CView)。一個(gè)主窗口可以有多個(gè)子框架窗口。文檔類(CDocument)是文檔視圖結(jié)構(gòu)中最重要的類,可以將其看成是應(yīng)用程序處理的所有(數(shù)據(jù))對(duì)象構(gòu)成的集合。視圖類(CView)對(duì)象可以看成是窗口中的一個(gè)矩形區(qū)域,這個(gè)區(qū)域也代表了軟件中最基本的人機(jī)交互界面,幾乎所有基本的交互操作都是通過這個(gè)視圖對(duì)象中實(shí)現(xiàn)的。每個(gè)子框架窗口還可以擁有一個(gè)或多個(gè)視圖。MFC還定義了多個(gè)不同的視圖類,其中的一些視圖類就已經(jīng)具有了十分強(qiáng)大的功能,如CEditView類和CRichEditView類就直接封裝了文本編輯方面的交互功能。設(shè)計(jì)時(shí),選擇合適的視圖類將可以充分地復(fù)用這些功能。視圖類中,CView類既是所有視圖類的基類,也是其中最基本的類。文檔模版(CDocTemplate)類封裝了文檔(Document)、視圖(View)、框架窗口(Frame)等三種類的RUNTIMECLASS類實(shí)例,以及一個(gè)用來指定特定文檔(Document)需要的菜單資源的成員變量。一般情況下,當(dāng)你的應(yīng)用程序只處理一種類型的文檔時(shí),應(yīng)用程序不需要訪問這個(gè)文檔模版(CDocTemplate)類對(duì)象。13.3.2應(yīng)用程序的基本結(jié)構(gòu)下面考慮這個(gè)應(yīng)用程序的總體結(jié)構(gòu)設(shè)計(jì),我們選擇MFC的多文檔應(yīng)用程序框架構(gòu)建了本程序的基本結(jié)構(gòu)。圖13-5給出了這個(gè)應(yīng)用程序的總體框架。圖中,類CGraphicsApp是MFC類庫中應(yīng)用程序類CWinApp的一個(gè)實(shí)現(xiàn),其實(shí)例表示程序的應(yīng)用程序?qū)ο螅活怌MainFrame是框架中CMDIFrameWindEx類的實(shí)現(xiàn),其實(shí)例表示應(yīng)用程序的主窗口對(duì)象;類CChildFrame是子窗口類,其實(shí)例是主窗口的子窗口,它也是視圖對(duì)象的容器;CGraphicsDocument是文檔類,是框架中文檔類CDocument的一個(gè)實(shí)現(xiàn);CMultiDocTemplate是MFC特有的文檔模板類,其每個(gè)實(shí)例都可以封裝一個(gè)由子窗口類、視圖類和文檔類的運(yùn)行時(shí)類實(shí)例(CRuntimeClass類)的組合,這個(gè)組合描述了子窗口、文檔以及視圖之間所特有的關(guān)系。從而為支持多文檔程序框架提供了一種方便的實(shí)現(xiàn)機(jī)制。最后,CGraphicsElement類是自定義的圖形元素類。圖13-5程序總體結(jié)構(gòu)框架13.3.3圖形文檔類的設(shè)計(jì)首先考慮文檔類的設(shè)計(jì),設(shè)計(jì)內(nèi)容即包括文檔類的物理結(jié)構(gòu)設(shè)計(jì),也包括文檔元素類的設(shè)計(jì)。好的設(shè)計(jì)應(yīng)嚴(yán)格封裝文檔的物理結(jié)構(gòu),以使得外部對(duì)象僅按照某種特定的邏輯訪問這些文檔對(duì)象。13.3.3圖形文檔類的設(shè)計(jì)1.圖形元素類從前面的概念模型中,可以看出圖形元素時(shí)文檔中最重要的組成元素,這些元素的首要特征是元素的結(jié)構(gòu)特征。軟件支持多種不同的類型的圖形元素。而從擴(kuò)充的角度來講,概念模型中也許并未包含所有最終的圖形元素類型。但這些圖形元素的共同特征是,它們均包含了描述圖形元素的拓?fù)浣Y(jié)構(gòu)所需的幾何特征和其它信息(如顏色、紋理和寬度等信息)所需的非幾何特征。必要時(shí),它們還可能包括某種特定的語義特征(如,應(yīng)用于特定領(lǐng)域的圖形元素所具有的語義特征)。其次,這些圖形元素的第二個(gè)方面的特征是圖形元素的組合性,即可以將多個(gè)簡(jiǎn)單的圖形元素組合成更復(fù)雜的復(fù)合元素。這使得文檔結(jié)構(gòu)具有更復(fù)雜的層次結(jié)構(gòu),從而支持用戶編輯更具有層次感的文檔結(jié)構(gòu)。另外,復(fù)合元素的引入還會(huì)為軟件帶來更好的可擴(kuò)充性。如,從一個(gè)單頁的文檔擴(kuò)充成多頁的文檔結(jié)構(gòu)等。13.3.3圖形文檔類的設(shè)計(jì)第三方面的特征是定義在圖形元素上的各種操作,這些操作可分為元素操作、元素組操作以及復(fù)合操作等多種情況。元素操作指操作對(duì)象是單個(gè)的圖形元素的操作,即直接修改圖形元素狀態(tài)的簡(jiǎn)單操作,如修改、移動(dòng)、刪除和Z序操作等。元素組操作指定義在多個(gè)元素(元素集合)之上的操作,如移動(dòng)、修改和刪除成組元素的操作。還包括對(duì)多個(gè)元素進(jìn)行的組合和解組等集合操作。復(fù)合操作則是指定義在操作之上的操作,如撤銷和重做操作。上面所有這些因素,都影響著軟件實(shí)體類的設(shè)計(jì),好的設(shè)計(jì)應(yīng)該能夠充分地支持或反映所有這些結(jié)構(gòu)特征和功能特征,更應(yīng)該使軟件在實(shí)現(xiàn)這些操作時(shí)具有好的可靠性和時(shí)空性能。13.3.3圖形文檔類的設(shè)計(jì)CGraphicsElement類中定義了所有圖形元素共有的屬性,包括圖形元素的基本屬性、幾何屬性和非幾何屬性等。1)基本屬性指所有圖形元素所共有的屬性。本軟件的基本屬性被定義成圖形元素的包圍盒,即一個(gè)包含了圖形元素所有頂點(diǎn)的最小矩形區(qū)域,用于支持圖形元素的拖放操作。2)語義屬性語義屬性是一種用于表示模型元素所具有的特定語義的屬性。當(dāng)軟件屬于某個(gè)特定的應(yīng)用領(lǐng)域時(shí),可使該應(yīng)用域的特定的語義屬性表示。這個(gè)軟件的語義屬性被簡(jiǎn)單地定義成一段文本。這些屬性定義如下:intleft,top,right,bottom; //表示圖形元素的矩形包圍盒。CStringText; //用戶定義的字符串13.3.3圖形文檔類的設(shè)計(jì)3)幾何屬性用于表示圖形元素的基本拓?fù)浣Y(jié)構(gòu),如表示圖形的位置、大小和形狀等方面的屬性。本軟件中,幾何屬性被簡(jiǎn)單定義地成一個(gè)圖形頂點(diǎn)的集合。CArray<CPoint,CPoint&>mVertexArray;4)非幾何屬性用于描述繪制圖形元素時(shí)所需要的屬性。例如圖形中線的色彩、粗細(xì)、形狀和風(fēng)格等方面特征的屬性。圖13-6圖形元素類的設(shè)計(jì)2.圖形元素的非幾何屬性為了能夠以統(tǒng)一的方式使用各種圖形屬性,定義了一個(gè)抽象的圖形屬性類(CElementProperties),作為圖形屬性對(duì)象的接口,并得到了一個(gè)的層次結(jié)構(gòu)。圖13-7圖形元素的非幾何屬性13.3.3圖形文檔類的設(shè)計(jì)表13-1圖形元素的非幾何屬性序號(hào)圖形元素圖形元素類對(duì)應(yīng)的非幾何屬性類1直線ClineClineProperties2矩形CReactagleCFigureProperties3橢圓CEllipseCFigureProperties4多邊形CPolyRectangleCFigureProperties5文本CTextCTextProperties6圖片CPictureCPictureProperties7復(fù)合元素CCompositeElementCCompositeProperties8頁CPageCCanvasProperties13.3.3圖形文檔類的設(shè)計(jì)容易看出,矩形CReactagle、橢圓CEllipse和多邊形CPolyRectangle等類的非幾何屬性的定義是相同的,它們使用了非幾何屬性(CFigureProperties)。這樣設(shè)計(jì)的目的是盡量減少這些類之間數(shù)據(jù)定義甚至是程序代碼之間的冗余,這更有利于有助于提高程序的設(shè)計(jì)效率。13.3.3圖形文檔類的設(shè)計(jì)3.圖形元素類的方法表13-2圖形元素類的主要方法序號(hào)方法說明1virtualCGraphicElement*Clone();深度復(fù)制圖形元素對(duì)象2virtualvoidSerialize(CArchive&ar);序列化函數(shù),用于序列化當(dāng)前對(duì)象3virtualvoidDraw(CDC*pDC);繪制函數(shù),用于繪制圖形元素4virtualvoidDrawFrame(CDC*pDC);繪制邊框,用于繪制圖形的矩形包圍盒5virtualintIncluded(CPointpoint);判斷指定點(diǎn)是否包含于圖形的區(qū)域內(nèi)6virtualenumPointAtPointAt(CPointpoint);返回指定點(diǎn)關(guān)于當(dāng)前圖素的相對(duì)位置7virtualintAdjust(CGraphicElement*Orgin);調(diào)整大小,按指定圖素的大小調(diào)整圖形元素的大小8virtualintOffset(CGraphicElement*Orgin,intdx,intdy);移動(dòng)位置,按指定圖素的位置移動(dòng)當(dāng)前圖形元素的位置9virtualvoidSetVisible(boolIsVisible=true);設(shè)置可見標(biāo)識(shí)13.3.3圖形文檔類的設(shè)計(jì)4.復(fù)合元素類的設(shè)計(jì)所謂的復(fù)合元素是指圖形文檔中,若干個(gè)簡(jiǎn)單元素或復(fù)合元素構(gòu)成的元素。圖13-8描述了軟件中復(fù)合元素的設(shè)計(jì),圖中的CCompositElement就是所謂的復(fù)合元素。它一方面繼承了CGraphicsElement的接口,另一方面還被定義成了CGraphicsElement元素的集合。這個(gè)設(shè)計(jì)應(yīng)用了GOF模式中的組合模式。它使得用戶可以將圖形文檔中的簡(jiǎn)單元素組成更大的復(fù)合元素,從而使用戶可以構(gòu)建更復(fù)雜的復(fù)合文檔。13.3.3圖形文檔類的設(shè)計(jì)圖13-8復(fù)合元素的設(shè)計(jì)13.3.3圖形文檔類的設(shè)計(jì)4.復(fù)合元素類的設(shè)計(jì)另外,圖13-8中還描述了一個(gè)特殊的復(fù)合文檔類CPage。這個(gè)對(duì)象被定義成一個(gè)特殊的用于連接文檔和圖形元素之間關(guān)系的對(duì)象,用于表示文檔的一個(gè)頁。進(jìn)一步修改或擴(kuò)充一下這個(gè)軟件,就可以很容易地得到一個(gè)包含了多個(gè)頁的圖形編輯軟件。在軟件的設(shè)計(jì)過程中,這個(gè)對(duì)象的引入,極大地將低了文檔類的設(shè)計(jì)難度。它使得很多原來被分配到文檔類中的方法被轉(zhuǎn)移到復(fù)合類中,極大地簡(jiǎn)化了文檔類的設(shè)計(jì)。并使軟件具有了更清晰的結(jié)構(gòu)和更好的可擴(kuò)充性。13.3.3圖形文檔類的設(shè)計(jì)4.復(fù)合元素類的設(shè)計(jì)復(fù)合元素類的方法包括圖形元素的添加、刪除和修改等元素管理方面的操作。還包括圖層操作、序列化操作、選擇和移動(dòng)等操作。表13-3復(fù)合元素類的主要操作序號(hào)方法說明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);移動(dòng)圖形元素16CCompositeElement*CreateCommposite(CElementGroup*p);生成復(fù)合元素17virtualCCompositeElement*Clone();克隆操作18virtualenumPointAtPointAt(CPointp,HCURSOR&h);檢索鼠標(biāo)位置13.3.3圖形文檔類的設(shè)計(jì)5.文檔類的設(shè)計(jì)從邏輯上看,本軟件的文檔對(duì)象可以視為圖形元素構(gòu)成的集合。從物理結(jié)構(gòu)的角度,文檔對(duì)象則被定義成若干個(gè)頁(page)構(gòu)成的集合,每個(gè)頁又可以看成是一個(gè)由多個(gè)圖形元素構(gòu)成集合。為了實(shí)現(xiàn)這樣的物理結(jié)構(gòu),在文檔類(CGraphicsDocument)對(duì)象中組合了一個(gè)頁(CPage類)對(duì)象集合,其中的每個(gè)CPage類對(duì)象又被設(shè)計(jì)成組合元素類的一個(gè)派生類。這樣的設(shè)計(jì)為文檔結(jié)構(gòu)提供了一個(gè)清晰的層次結(jié)構(gòu)。在任何時(shí)刻,用戶所看到的元素均呈現(xiàn)出組合和元素這樣的層次結(jié)構(gòu),既符合用戶的邏輯思維習(xí)慣,又便于軟件的具體實(shí)現(xiàn)。圖13-9描述了這樣一個(gè)文檔類的設(shè)計(jì)。其中的CGraphicsDocument類就是這個(gè)文檔類。13.3.3圖形文檔類的設(shè)計(jì)5.文檔類的設(shè)計(jì)圖13-9文檔類的結(jié)構(gòu)13.3.3圖形文檔類的設(shè)計(jì)5.文檔類的設(shè)計(jì)CGraphicsDocument類中,defFigureProperties、defPictureProperties、defTextProperties和defLineProperties等四個(gè)屬性表示圖形元素的默認(rèn)非幾何元素屬性。建立新圖形元素時(shí),這些屬性的值將作為新圖形元素的缺省屬性。圖中的CPage類就是所謂的頁,它是復(fù)合文檔元素類(CConmpositElement)的一個(gè)派生類。不同的是,頁具有相對(duì)固定的大小,而復(fù)合文檔元素的大小則是可變的,其具體的大小與其內(nèi)容有關(guān)。CGraphicsElement這時(shí)圖形元素類。由于文檔類對(duì)象在邏輯上被視為若干個(gè)圖像元素構(gòu)成的集合,因此,其主要的方法就應(yīng)該是為組織、管理和存儲(chǔ)它所擁有的所有圖形元素提供外部服務(wù)。13.3.3圖形文檔類的設(shè)計(jì)5.文檔類的設(shè)計(jì)可以對(duì)用例進(jìn)行動(dòng)態(tài)建模,如使用活動(dòng)圖、狀態(tài)圖、順序圖或通訊圖建模,找出文檔對(duì)象承擔(dān)的職責(zé),可以找出文檔類中應(yīng)有的方法了。例如,對(duì)于保存文檔功能,可以使用動(dòng)態(tài)模型對(duì)保存過程進(jìn)行建模,這樣就可以為文檔類及其相關(guān)類找到相應(yīng)的職責(zé)。圖13-10的順序圖就描述了保存文檔過程的參與者及其它們之間的交互。13.3.3圖形文檔類的設(shè)計(jì)5.文檔類的設(shè)計(jì)圖13-10保存文檔過程13.3.3圖形文檔類的設(shè)計(jì)序號(hào)方法說明1virtualvoidSerialize(CArchive&ar);序列化圖形元素2intAdd(CGraphicElement*pElement);添加圖形元素3intDelete(CGraphicElement*pElement);刪除圖形元素4voidInsertTo(intindex,CGraphicElement*pElement);插入圖形元素5voidDraw(CDC*pDC);顯示圖形元素6intGetItemCount();返回文檔元素個(gè)數(shù)7CGraphicElement*SelectElement(CPointpoint,int&Index);按位置查找圖形元素8intSwapeElement(intOrgin,intNew);交換圖形元素9intGetWidth();返回畫布寬度10intGetHeight();返回畫布高度11intReplace(CGraphicElement*O,CGraphicElement*N);替換圖形元素表13-3文檔類的主要方法13.3.4視圖類設(shè)計(jì)在MFC文檔視圖結(jié)構(gòu)的程序框架中,視圖承擔(dān)了用戶與文檔對(duì)象之間的最重要的橋梁,視圖對(duì)象負(fù)責(zé)向用戶顯示文檔的內(nèi)容和狀態(tài),甚至還可以向用戶展示用戶與系統(tǒng)之間的交互過程。同時(shí),視圖對(duì)象還負(fù)責(zé)接受用戶的操作請(qǐng)求,并將這些用戶請(qǐng)求轉(zhuǎn)交給文檔對(duì)象。因此,視圖對(duì)象的設(shè)計(jì)是基于文檔視圖結(jié)構(gòu)的程序框架中最具有挑戰(zhàn)性的部分。13.3.4視圖類設(shè)計(jì)1.屬性定義1)視圖狀態(tài)ViewStatusmViewStatus;其中,mViewStatus是一個(gè)枚舉類型的變量,用于表示視圖的當(dāng)前狀態(tài)。其具體的值被定義為{NORMAL,CREATE,CREATING,TEXTEDIT,SELECTED,MULTISELECTED,MOVING}等。2)對(duì)象類型:KindsOfElementCurrentElementClass;其中的CurrentElementClass是一個(gè)枚舉型變量,用于表示創(chuàng)建圖形元素時(shí),用戶選擇的圖形元素類型。其具體的取值為{enumNone,enumLine,enumRectangle,enumPolyRectangle,enumText,enumEllipse,enumPicture};3)窗口范圍和視口范圍intstartx,starty;intxWinExt,yWinExt,xViewExt,yViewExt; 它們分別表示視圖對(duì)象的視口原點(diǎn)、窗口范圍和視口范圍,用于實(shí)現(xiàn)圖形縮放操作。4) 命令列表CCommandListOperationList;命令列表對(duì)象,用于支持恢復(fù)和重做操作。13.3.4視圖類設(shè)計(jì)2.方法定義對(duì)于視圖類中的方法,這里僅討論軟件中我們自己添加的部分方法。而忽略框架生成的那些方法。1生成創(chuàng)建對(duì)象:根據(jù)與欲創(chuàng)建的圖素類型,生成一個(gè)具體的創(chuàng)建對(duì)象類實(shí)例。CCreateCommand*GenAnCreateOperation(ClassOfElementenumObject,HWNDhwnd,CPointpoint);2繪制函數(shù):這是一個(gè)在視圖類基類中定義的函數(shù),用于繪制文檔內(nèi)容。其具體實(shí)現(xiàn)是顯示文檔的內(nèi)容。virtualvoidOnDraw(CDC*pDC);3創(chuàng)建圖素對(duì)象:這是一組用于處理用戶創(chuàng)建圖素對(duì)象請(qǐng)求的函數(shù),每個(gè)函數(shù)對(duì)應(yīng)一種具體的圖素類型。在用戶界面上,也對(duì)應(yīng)了一組用戶界面元素(如命令按鈕和命令菜單等)。 這些函數(shù)包括:afx_msgvoidOnLine();//直線afx_msgvoidOnRectangle();//矩形afx_msgvoidOnPolyrectangle();//多邊形afx_msgvoidOnText();//文本afx_msgvoidOnEllipse();//橢圓afx_msgvoidOnPicture();//圖片13.3.4視圖類設(shè)計(jì)4Z序操作:用于修改圖形元素的Z序。afx_msgvoidOnPrivious();//上移一層afx_msgvoidOnNext();//下移一層afx_msgvoidOnTop();//移到頂層afx_msgvoidOnBottom();//移到最底層5縮放操作:用于放大和縮小圖形元素的顯示。afx_msgvoidOnSizedown();//縮小afx_msgvoidOnSizeup();//放大6屬性:用于修改圖形的非幾何屬性。afx_msgvoidOnProperty();//屬性13.3.4視圖類設(shè)計(jì)7鼠標(biāo)事件函數(shù):這是視圖類中最重要的四個(gè)函數(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è)計(jì)觀察這些函數(shù)時(shí)將會(huì)發(fā)現(xiàn),除了第一個(gè)函數(shù)之外,其余函數(shù)都是事件驅(qū)動(dòng)函數(shù),即每個(gè)函數(shù)都對(duì)應(yīng)了一個(gè)特定的事件。而圖13-14中的狀態(tài)圖,并沒有完全涵蓋所有這些事件。當(dāng)然也沒有涵蓋視圖對(duì)象對(duì)這些事件的反應(yīng)。這也說明了,任何一個(gè)單獨(dú)的模型都只能是對(duì)軟件的概括性描述??偟膩碚f,這些方法應(yīng)該包括了前面所提到過的大多數(shù)軟件功能、用例和文檔結(jié)構(gòu)等方面的描述。13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝為了有效地管理軟件中定義的各種操作并進(jìn)行撤銷和恢復(fù),我們將用戶操作封裝成一個(gè)對(duì)象來加以實(shí)現(xiàn)。用戶每執(zhí)行一個(gè)操作,系統(tǒng)就創(chuàng)建一個(gè)對(duì)象來封裝用戶所完成的操作,同時(shí)按照操作進(jìn)行的順序保存好這些對(duì)象。當(dāng)用戶想要撤銷他剛剛做過的操作時(shí),系統(tǒng)就可以取出用戶剛剛完成的操作對(duì)象,執(zhí)行這個(gè)操作的逆操作。圖13-11用戶命令類設(shè)計(jì)13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝其中Command類為所有命令類的基類,它為所有命令對(duì)象提供了一個(gè)統(tǒng)一的接口。接口的主要內(nèi)容包括Undo()和ReDo()兩個(gè)操作。通過這個(gè)接口,可以實(shí)現(xiàn)用戶命令的撤銷和重做。CCommandList類可以看成是命令的一個(gè)聚合,用于保存軟件運(yùn)行過程中產(chǎn)生的操作對(duì)象。CommandList被定義成一個(gè)雙棧結(jié)構(gòu)的命令列表,里面保存了兩個(gè)棧,分別存放剛剛執(zhí)行過的操作和剛剛撤銷的用戶操作。系統(tǒng)通過訪問這兩個(gè)棧里的操作,分別實(shí)現(xiàn)撤銷和重做這兩個(gè)操作。圖中還展示了創(chuàng)建(CCreateCommand)、刪除(CDeleteCommand)、修改(CModifyCommand)、移動(dòng)(CMoveCommand)、編輯(CTextEditCommand)、Z序(CZOrderCommand)、組合(CGroupCommand)、解組(CUnGroupCommand)和屬性(CPropertyCommand)等多個(gè)命令類的派生類。這些派生類在實(shí)現(xiàn)了CCommand接口的基礎(chǔ)上,又增加了各自不同的操作。其中創(chuàng)建對(duì)象命令(CCreateCommand)和移動(dòng)(CMoveCommand)又依照其操作的對(duì)象的類型的不同又被分成多種不同的情況。13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖13-12中的類圖描述了所有創(chuàng)建對(duì)象命令(CCreateCommand)類的結(jié)構(gòu)。其中,CCreateRectangle用于創(chuàng)建矩形對(duì)象。CCreateText用于創(chuàng)建矩形對(duì)象,CCreatePicture用于創(chuàng)建圖片對(duì)象,CCreateLine用于創(chuàng)建直線對(duì)象,CCreatePolyRectangle用于創(chuàng)建多邊形對(duì)象。CCreateEllipse用于創(chuàng)建橢圓對(duì)象。值得注意的是,CCreateComand類增加了一組用于支持交互式創(chuàng)建或修改圖形元素對(duì)象的方法。這樣,這些創(chuàng)建圖形元素的命令類就可以即支持撤銷和重做操作。同時(shí),又可以在創(chuàng)建圖形元素的場(chǎng)景中,支持圖形元素對(duì)象的創(chuàng)建。13.3.5交互操作的結(jié)構(gòu)圖13-12創(chuàng)建對(duì)象命令類圖13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖13-13中的類圖描述了移動(dòng)圖形元素命令(CMoveCommand)類及其派生類的結(jié)構(gòu)。其中,CMoveCommand對(duì)象用于移動(dòng)文檔中某個(gè)圖形元素;CMoveFrameCommand對(duì)象用于移動(dòng)圖形元素的邊框,這相當(dāng)于對(duì)內(nèi)部的圖形完成一次水平或垂直的拉伸變換,結(jié)果是改變了圖形的形狀;CMoveVertexCommand對(duì)象用于移動(dòng)多邊形的特定頂點(diǎn),結(jié)果是改變了多邊形的形狀;而CMoveEdgeCommand對(duì)象則用于移動(dòng)多邊形的某條邊,來改變多邊形的形狀;13.3.5交互操作的結(jié)構(gòu)圖13-13移動(dòng)圖形元素命令類圖13.3.5交互操作的結(jié)構(gòu)1.交互操作的封裝圖中的最后一個(gè)類,CMoveCommandGroup對(duì)象則用于移動(dòng)一組圖形元素,它被設(shè)計(jì)成一組命令的集合。這樣的命令可以稱之為宏命令。執(zhí)行時(shí),首先為每個(gè)選中的圖形元素生成一個(gè)移動(dòng)命令,再將這些命令組合成一個(gè)宏命令,在執(zhí)行這個(gè)宏命令的Do方法,即逐個(gè)執(zhí)行其中的子命令。當(dāng)然,撤銷時(shí),也是執(zhí)行宏命令的UnDo方法,即逐個(gè)地執(zhí)行每個(gè)命令的Undo命令。從而撤銷對(duì)一組對(duì)象的移動(dòng)。13.3.5交互操作的結(jié)構(gòu)2.命令對(duì)象的創(chuàng)建系統(tǒng)運(yùn)行過程中,每個(gè)操作都是由用戶的操作意圖決定的。用戶需要將其操作意圖轉(zhuǎn)換成操作的前置條件。在指定前置條件下,一旦發(fā)生了特定的用戶事件,則系統(tǒng)就會(huì)創(chuàng)建指定的命令對(duì)象并開始一個(gè)交互過程,在這個(gè)過程中與用戶交互,實(shí)現(xiàn)用戶的操作意圖。值得注意的是,在這個(gè)交互過程中,每一個(gè)動(dòng)作都應(yīng)該使系統(tǒng)處于某種一致性的狀態(tài)。
表13-4列出了圖形元素操作過程中需要識(shí)別的條件、用戶事件以及后續(xù)要完成的操作。所有這些要素就構(gòu)成了設(shè)計(jì)和實(shí)現(xiàn)這些交互操作的重要基礎(chǔ)。表13-4創(chuàng)建交互命令對(duì)象的前置條件和用戶事件用戶的操作意圖前置條件用戶事件創(chuàng)建的命令對(duì)象類型創(chuàng)建矩形圖形元素選擇矩形單擊編輯區(qū)CCreateRectangle創(chuàng)建文本圖形元素選擇文本單擊編輯區(qū)CCreateText創(chuàng)建圖片圖形元素選擇圖片單擊編輯區(qū)CCreatePicture創(chuàng)建線段圖形元素選擇線段單擊編輯區(qū)CCreateLine創(chuàng)建多邊形圖形元素選擇多邊形單擊編輯區(qū)CCreatePolyRectangle創(chuàng)建橢圓矩形圖形元素選擇橢圓單擊編輯區(qū)CCreateEllipse移動(dòng)圖形元素選擇圖形元素鼠標(biāo)移動(dòng)事件CMoveCommand移動(dòng)邊框選擇圖形元素邊框鼠標(biāo)移動(dòng)事件CMoveFrameCommand移動(dòng)多邊形的頂點(diǎn)選擇多邊形的頂點(diǎn)鼠標(biāo)移動(dòng)事件CMoveVertexCommand移動(dòng)多邊形的邊選擇多邊形的邊鼠標(biāo)移動(dòng)事件CMoveEdgeCommand刪除圖形元素選擇了某個(gè)圖形元素發(fā)生Del鍵盤事件CDeleteCommand修改圖形元素顯示順序選擇了某個(gè)圖形元素修改Z序事件CZOrderCommand組合復(fù)合圖素選擇了多個(gè)圖形元素發(fā)生組合命令事件CGroupCommand解組復(fù)合圖形元素選擇了某個(gè)復(fù)合元素發(fā)生解組命令事件CUnGroupCommand修改圖形非幾何屬性選擇了某個(gè)圖形元素發(fā)生屬性命令事件CPropertyCommand13.3.5交互操作的結(jié)構(gòu)2.命令對(duì)象的創(chuàng)建下面以實(shí)現(xiàn)創(chuàng)建圖形元素為例,說明一下如何實(shí)現(xiàn)創(chuàng)建圖形元素對(duì)象操作。我們使用了工廠方法模式實(shí)現(xiàn)了上述過程中的創(chuàng)建圖形對(duì)象操作。其具體實(shí)現(xiàn)方法是:首先,在視圖類中,定義了一個(gè)狀態(tài)變量表示欲創(chuàng)建的圖形元素類型。ClassOfElementCurrentElementClass;其中,ClassOfElement是一個(gè)枚舉類型,其具體定義如下:typedefenum{none,sLine,sRectangle,sPolyRectangle,sText,sEllipse,sPicture}ClassOfElement;其次,在CGraphicsView類中定義了一個(gè)名為GenAnCreateOperation的工廠方法,用于創(chuàng)建具體的創(chuàng)建命令對(duì)象。13.3.5交互操作的結(jié)構(gòu)這個(gè)方法的代碼如下。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)建圖形元素對(duì)象的過程一定是一個(gè)復(fù)雜的過程。如果為每種不同的元素定義不同的交互過程,將不可避免地增加系統(tǒng)的復(fù)雜性,同時(shí)這樣的設(shè)計(jì)也不利于系統(tǒng)的擴(kuò)充和維護(hù)。因此,設(shè)計(jì)一個(gè)可以用于不同類型的元素的創(chuàng)建的過程就成為一個(gè)優(yōu)先考慮的選擇。這里,我們?cè)诔浞挚紤]不同類型的圖形元素的基礎(chǔ)上,設(shè)計(jì)了如下的創(chuàng)建抽象圖形元素的過程。創(chuàng)建圖形元素對(duì)象的操作過程可以簡(jiǎn)單地描述如下:1選擇圖形元素類型,如直線、矩形、橢圓、多邊形、文本和圖片等類型。2依次輸入圖形元素的各頂點(diǎn)坐標(biāo)。2.1將鼠標(biāo)指針移動(dòng)到圖形元素的起始位置按下鼠標(biāo),系統(tǒng)將創(chuàng)建一個(gè)圖形元素對(duì)象。2.2用戶將鼠標(biāo)拖動(dòng)到圖形元素的下一個(gè)頂點(diǎn)位置,釋放鼠標(biāo),系統(tǒng)將該坐標(biāo)值設(shè)置成創(chuàng)建對(duì)象的第二個(gè)頂點(diǎn)坐標(biāo)值。2.3若用戶沒有為當(dāng)前圖形元素輸入足夠的頂點(diǎn)坐標(biāo),則用戶可單擊鼠標(biāo)輸入下一個(gè)坐標(biāo)位置,每點(diǎn)擊一次輸入一個(gè)頂點(diǎn)坐標(biāo)。直到用戶雙擊鼠標(biāo)為止。3將當(dāng)前對(duì)象插入到當(dāng)前復(fù)合對(duì)象中。4結(jié)束。13.3.5交互操作的結(jié)構(gòu)圖13-14創(chuàng)建圖形元素對(duì)象的過程13.3.5交互操作的結(jié)構(gòu)3.創(chuàng)建圖形元素的交互過程雖然,創(chuàng)建不同類型的圖形元素對(duì)象時(shí),其具體的執(zhí)行過程是不盡相同的。但圖13-14中的順序圖卻展示了一個(gè)比較抽象或一致的過程,這個(gè)過程涵蓋了創(chuàng)建各種圖形元素所需要的過程。對(duì)于直線、矩形和橢圓等具有固定頂點(diǎn)個(gè)數(shù)的圖形元素對(duì)象來說,這些對(duì)象可以根據(jù)輸入的頂點(diǎn)個(gè)數(shù)判斷創(chuàng)建過程的進(jìn)展,進(jìn)而完成對(duì)象的創(chuàng)建。而對(duì)于多邊形來說,由于其頂點(diǎn)個(gè)數(shù)不是事先確定的。因此,它需要定義一個(gè)專門的事件(如鼠標(biāo)雙擊事件),來確定何時(shí)結(jié)束多邊形頂點(diǎn)的輸入過程,我們?cè)陧旤c(diǎn)輸入過程中引入了這樣的一個(gè)事件。而對(duì)于不需要這個(gè)事件的創(chuàng)建過程,例如橢圓等元素的控制點(diǎn)輸入過程,則直接忽略了這個(gè)事件。13.3.5交互操作的結(jié)構(gòu)3.創(chuàng)建圖形元素的交互過程再例如,創(chuàng)建圖片(Picture)和文本(Text)對(duì)象時(shí),在輸入完圖形元素的頂點(diǎn)坐標(biāo)之后,還需要一個(gè)輸入圖片文件名或文本內(nèi)容等信息的編輯過程,我們也在創(chuàng)建圖形元素對(duì)象過程中加入了這樣一個(gè)編輯操作,而對(duì)于不需要這種編輯操作的創(chuàng)建過程來說,則通過空操作的方式忽略了這個(gè)編輯操作。這樣,我們建立了一個(gè)統(tǒng)一或一致的過程,這個(gè)過程兼容了問題的各種不同情況,解決了這個(gè)過程的復(fù)雜性問題。在最終的實(shí)現(xiàn)方案中,系統(tǒng)在其視圖類的創(chuàng)建對(duì)象過程的代碼中,僅使用CCreateCommand接口就實(shí)現(xiàn)了圖形元素對(duì)象的創(chuàng)建,這樣的方式有效地簡(jiǎn)化了視圖類的程序代碼。這也符合了里氏代換原則,雖然這樣的程序代碼比較抽象,但它更簡(jiǎn)潔、也更有利于系統(tǒng)的擴(kuò)充和維護(hù)。13.4動(dòng)態(tài)建??紤]如何實(shí)現(xiàn)前面定義的各種操作(見表13-1)。軟件中的任何操作都可以看成是通過軟件中的某些對(duì)象之間的一系列交互實(shí)現(xiàn)的。全景式的過程建模通常是不存在的,過程建模的粒度通??梢允怯美?、用例場(chǎng)景或動(dòng)作為單位來進(jìn)行的。而且,用例動(dòng)態(tài)建模應(yīng)盡可能簡(jiǎn)單明了。即建模的目的是簡(jiǎn)化模型而不是故意使問題更加復(fù)雜。UML主要通過活動(dòng)圖、狀態(tài)圖、時(shí)序圖和通訊圖等四種模型建模軟件的動(dòng)態(tài)行為。對(duì)于活動(dòng)圖來說,活動(dòng)圖主要用于在較高的抽象層次上,描述某個(gè)過程,如業(yè)務(wù)流程、用例等。前面我們已經(jīng)給出了幾個(gè)活動(dòng)圖建模的例子(如圖13-8和圖13-9等)。這些活動(dòng)圖圖所反映的僅僅是從用戶視角看到的一個(gè)比較概括的操作過程。它們的作用往往用于說明從用戶的角度看到的操作過程。下面我們將分別使用順序圖、通訊圖和狀態(tài)圖的幾個(gè)例子來說明這些模型的作用。13.4.1順序圖建模順序圖通常用于描述一個(gè)用例(操作)或用例中的特定場(chǎng)景,如果希望完整地描述一個(gè)用例,有時(shí)可能需要繪制多張順序圖。順序圖建模有助于找到實(shí)現(xiàn)一個(gè)用例所需要的角色以及每個(gè)角色中所包含的方法。從概念上來說,角色可以看成是一組相關(guān)的方法的集合。對(duì)于一個(gè)具體的順序圖來說,角色可能是一個(gè)抽象的角色,也可能是一個(gè)具體的對(duì)象、類或接口等。最終,這些角色將被落實(shí)到系統(tǒng)的結(jié)構(gòu)中。圖中的每個(gè)消息則可以落實(shí)成對(duì)應(yīng)角色的具體方法。13.4.1順序圖建模下面,我們使用一張更細(xì)化的順序圖(圖13-15)來描述一下創(chuàng)建圖形元素對(duì)象的過程。從圖13-15可以得到的信息包括:參與圖形元素創(chuàng)建過程的角色、方法以及方法的守衛(wèi)條件等。這樣一個(gè)描述顯然更具體或更接近于目標(biāo)系統(tǒng)。還有一個(gè)問題是前面提到過的多邊形的創(chuàng)建問題。圖13-15中則給出了這個(gè)問題的更具體的解決辦法。13.4.1順序圖建模圖13-15創(chuàng)建圖形元素過程13.4.1順序圖建模從圖13-15可以獲得的信息包括:1實(shí)現(xiàn)創(chuàng)建圖形元素過程所需要的角色以及這些角色之間的關(guān)系從圖13-15中的順序圖可以看出,實(shí)現(xiàn)這個(gè)過程至少需要包括:用戶(User)、視圖(CGraphicsView)、創(chuàng)建命令對(duì)象(CCreateCommand)、圖形元素對(duì)象(CGraphicElement)、文檔對(duì)象(CGraphicsDocument)和操作命令列表(CCommandList)等多種不同的對(duì)象,以及這些對(duì)象之間應(yīng)具有的關(guān)聯(lián)關(guān)系。如果將圖13-15轉(zhuǎn)換成通訊圖,這可以更直觀地看出這些對(duì)象之間的鏈接關(guān)系,實(shí)際上這相當(dāng)于找到了這些類之間的關(guān)聯(lián)關(guān)系。13.4.1順序圖建模2對(duì)象之間傳遞的消息圖中每個(gè)對(duì)象所接收到的消息集合代表了這個(gè)對(duì)象所充當(dāng)?shù)囊环N角色。一個(gè)對(duì)象收到的所有消息相當(dāng)于這個(gè)角色在這個(gè)場(chǎng)景中需要的接口。例如,上圖中,CCreateCommand接收到的消息就包括了AddPoint(CPointpoint)、Complete()、SetComplete()和CreateObject()等四個(gè)消息。這四個(gè)消息不一定是CCreateCommand對(duì)象的所有操作,但一定是CCreateCommand對(duì)象在這張圖所描述的場(chǎng)景中所需要實(shí)現(xiàn)的一個(gè)接口。當(dāng)建模了足夠多的順序圖之后,就可能獲得同一個(gè)對(duì)象所充當(dāng)?shù)亩喾N不同角色,從而為這個(gè)類設(shè)計(jì)出更多的方法或所有的方法。13.4.1順序圖建模3參與者與系統(tǒng)之間的交互最后一個(gè)問題是,圖中的參與者User與CGraphicsView類之間的交互。例如,參與者User向CGraphicsView對(duì)象發(fā)出了的消息。由于User是一個(gè)參與者,即系統(tǒng)的外部實(shí)體,這兩者之間的交互代表的是系統(tǒng)與外部實(shí)體之間的交互,這些交互描述的是交互界面的設(shè)計(jì)要素。這些要素可以映射成各種外部事件,這些事件也對(duì)應(yīng)了CGraphicsView類的某些事件函數(shù),也對(duì)應(yīng)了系統(tǒng)需要的用戶界面元素(如菜單命令、命令按鈕和圖形屬性面板的設(shè)計(jì)等)以及這些用界面元素和事件函數(shù)之間的映射等。當(dāng)建模比較充分時(shí),這可能會(huì)幫助我們獲得更為完整的設(shè)計(jì)。13.4.2通訊圖建模通訊圖與順序圖是一種語義等價(jià)的動(dòng)態(tài)模型,使用它們可以獲得相同的建模增量。圖13-16給出了與順序圖(圖13-15)等價(jià)的通訊圖。圖13-16創(chuàng)建圖形元素過程的通訊圖表示13.4.1順序圖建模與順序圖不同的是,通訊圖中顯式地增加了類之間的關(guān)聯(lián)(或?qū)ο笾g的鏈接)。這為類的設(shè)計(jì)提供了更直觀的設(shè)計(jì)提示。要想從順序圖的建模獲得同樣的信息(類之間的關(guān)聯(lián)或?qū)ο笾g的鏈接),還需要建模人員進(jìn)行比較細(xì)致的分析。如順序圖(圖13-15)中并沒有直接出現(xiàn)類之間的關(guān)聯(lián)或?qū)ο笾g的鏈接。分析順序圖中的對(duì)象之間的傳遞的消息,有消息傳遞的類或?qū)ο笾g就應(yīng)該擁有用于傳遞這些消息的關(guān)聯(lián)或鏈接。同樣,順序圖中也沒有直接出現(xiàn)在通訊圖中的消息編號(hào),但分析順序圖中消息的發(fā)生順序、類型和消息之間的嵌套,同樣可以得到準(zhǔn)確的消息編號(hào)。從而得到等價(jià)的通訊圖。13.4.1順序圖建模通訊圖的建模過程與順序圖建?;绢愃?,但在同一過程的順序圖模型已經(jīng)存在的情況下,自動(dòng)轉(zhuǎn)換也是一個(gè)高效率的選擇。最后要說的是,雖然這兩種圖是語義等價(jià)的,它們?cè)谝曈X上帶給人的直觀感受和信息卻都是不一樣的,繪制出其中的任何一種表示就可以很容易地借助建模工具得到它的另一種表示,這可以極大地提高建模的工作效率。另外,如果各自獨(dú)立地使用不同模型對(duì)同一過程進(jìn)行建?;蛟S會(huì)起到相互檢查和相互校驗(yàn)的作用。13.4.3狀態(tài)圖建模動(dòng)態(tài)建模過程中,除了使用交互圖建模以外,還有一種重要的模型就是狀態(tài)圖。本軟件中充斥了大量的復(fù)雜的交互式圖形操作,而這些復(fù)雜的交互操作往往是以簡(jiǎn)單的鼠標(biāo)和鍵盤操作為基礎(chǔ)實(shí)現(xiàn)的。這為軟件的設(shè)計(jì)與實(shí)現(xiàn)均帶來了一定的難度。一個(gè)簡(jiǎn)單清晰的狀態(tài)模型將可以幫助我們有效地控制好系統(tǒng)的復(fù)雜度。因此,狀態(tài)模型也是簡(jiǎn)化本軟件設(shè)計(jì)的一個(gè)非常關(guān)鍵的問題。狀態(tài)圖的主要用于完整描述一個(gè)復(fù)雜對(duì)象的可能狀態(tài)以及狀態(tài)變遷時(shí)所表現(xiàn)的行為。一個(gè)建模充分的狀態(tài)圖可以有效降低后續(xù)的程序設(shè)計(jì)的設(shè)計(jì)難度,并盡可能避免程序設(shè)計(jì)中可能出現(xiàn)的結(jié)構(gòu)性錯(cuò)誤問題。13.4.3狀態(tài)圖建模視圖(CGraphicsView)對(duì)象的狀態(tài)圖建模根據(jù)軟件的需求模型,將視圖對(duì)象的狀態(tài)定義成:正常、創(chuàng)建、編輯、修改和移動(dòng)等五種狀態(tài)。這些狀態(tài)的具體定義如下:1NORMAL狀態(tài)表示視圖對(duì)象的初始狀態(tài),此狀態(tài)下沒有被選中的圖形元素和有待進(jìn)行的下一步操作。此時(shí),用戶可以創(chuàng)建(CREATE)新元素,也可以選擇現(xiàn)有元素,以便于移動(dòng)(MOVING)或修改(MODIFY)選中的操作。2CREATE狀態(tài)表示開始創(chuàng)建圖形元素對(duì)象的狀態(tài)。在此狀態(tài)下,用戶可以輸入要?jiǎng)?chuàng)建圖形元素的起始點(diǎn)。輸入完后,視圖將自動(dòng)進(jìn)入編輯(EDIT)狀態(tài),以最終完成圖形的創(chuàng)建。13.4.3狀態(tài)圖建模3EDIT狀態(tài)表示編輯新創(chuàng)建的圖形元素的各個(gè)點(diǎn)坐標(biāo)和其它屬性的狀態(tài)。如對(duì)于文本(CText)對(duì)象來說,需要輸入第二個(gè)坐標(biāo)點(diǎn);而對(duì)于圖形(CPicture)對(duì)象來說,則要輸入圖形文件。用戶完成圖形元素的編輯之后,創(chuàng)建的圖形元素保持被選中狀態(tài),視圖將進(jìn)入修改(MODIFY)狀態(tài)。4MODIFY狀態(tài)表示系統(tǒng)中有圖形元素被選中的狀態(tài)。此狀態(tài)下,用戶可以修改圖形元素。5MOVING狀態(tài)表示被選中的圖形元素處于被拖動(dòng)中的狀態(tài)。此狀態(tài)下,用戶可以移動(dòng)或修改圖形元素。圖13-17視圖對(duì)象的狀態(tài)圖13.4.3狀態(tài)圖建模圖13-17給出了視圖對(duì)象的狀態(tài)圖模型,圖中的狀態(tài)可以映射成視圖類的成員變量,定義的這些狀態(tài)為這個(gè)成員變量的取值范圍。圖中的每個(gè)遷移都包含了條件、事件和對(duì)應(yīng)的動(dòng)作。例如,對(duì)于下面的遷移表達(dá)式:Move(point)[pElement!=NULL]/Pt=PointAT(point);SetCoursor(LoadCourse(PT));其中的Move(point)是一個(gè)事件,表示鼠標(biāo)移動(dòng)到point點(diǎn);[pElement!=NULL]是遷移的警戒條件。最后,Pt=PointAT(point);SetCoursor(LoadCourse(PT));是一個(gè)動(dòng)作序列,含義是計(jì)算鼠標(biāo)指向選中的圖形元素的控制點(diǎn)的具體位置,這個(gè)位置決定了下一步要對(duì)圖形元素進(jìn)行的具體操作,如改變大小和移動(dòng)等。整個(gè)遷移表達(dá)式完整地描述了這個(gè)遷移的事件、條件和相應(yīng)的動(dòng)作序列。13.4.3狀態(tài)圖建模整個(gè)狀態(tài)圖完整地描述了視圖對(duì)象的狀態(tài)和狀態(tài)之間的變遷,還描述了每個(gè)狀態(tài)遷移的事件、條件和相關(guān)的動(dòng)作等內(nèi)容。讀者可以仔細(xì)對(duì)照一下此圖與程序代碼之間的關(guān)系,可以看出模型和程序代碼之間的對(duì)應(yīng)關(guān)系。也可以看出在編寫程序之前,為復(fù)雜的對(duì)象設(shè)計(jì)一個(gè)好的狀態(tài)模型對(duì)程序設(shè)計(jì)所起到的獨(dú)特作用。由于目前的大多數(shù)建模工具均不支持狀態(tài)機(jī)模型到應(yīng)用程序之間的直接轉(zhuǎn)換,因此,狀態(tài)圖到程序代碼的映射只能以人工的方式進(jìn)行。盡管如此,大量的實(shí)踐表明,建模充分的狀態(tài)機(jī)模型仍可以有效地幫助我們提高程序的開發(fā)效率和質(zhì)量。UML的活動(dòng)圖、狀態(tài)圖、順序圖和通訊圖等分別描述了一個(gè)軟件的不同側(cè)面,它們一起構(gòu)成了一個(gè)完整的軟件模型。13.5建模的抽象層次
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度物流運(yùn)輸公司股權(quán)轉(zhuǎn)讓書3篇
- 二零二五年度果樹病蟲害防治果園土地承包服務(wù)合同3篇
- 2025年度土地承包合同未滿征收補(bǔ)償與農(nóng)村土地權(quán)益置換政策執(zhí)行協(xié)議2篇
- 二零二五年度智慧城市運(yùn)營管理商業(yè)合同3篇
- 內(nèi)河漁船出售轉(zhuǎn)讓合同(2025年度)附帶船舶運(yùn)營許可及培訓(xùn)3篇
- 二零二五年度2025年企業(yè)租賃工業(yè)廠房合同3篇
- 2025年度綠色生態(tài)養(yǎng)殖合伙協(xié)議合同書3篇
- 二零二五年度新能源項(xiàng)目經(jīng)理勞務(wù)合同3篇
- 2025年度民事糾紛和解協(xié)議書與知識(shí)產(chǎn)權(quán)侵權(quán)賠償及和解協(xié)議3篇
- 2025年度人工智能領(lǐng)域出資技術(shù)合作框架協(xié)議
- 部編人教版語文八年級(jí)下冊(cè)文言文課下注釋
- 運(yùn)動(dòng)神經(jīng)元病護(hù)理課件
- 新(完整)小學(xué)三年級(jí)語文教學(xué)案例
- ZZ007 現(xiàn)代加工技術(shù)賽項(xiàng)正式賽題及評(píng)分標(biāo)準(zhǔn)完整版包括所有附件-2023年全國職業(yè)院校技能大賽賽項(xiàng)正式賽卷
- 麥肯錫:企業(yè)發(fā)展戰(zhàn)略規(guī)劃制定及實(shí)施流程教學(xué)課件
- 新課標(biāo)人教版五年級(jí)數(shù)學(xué)上冊(cè)總復(fù)習(xí)(全冊(cè))
- 土木工程管理與工程造價(jià)的有效控制探析獲獎(jiǎng)科研報(bào)告
- 基層版創(chuàng)傷中心建設(shè)指南(試行)
- 全過程造價(jià)咨詢服務(wù)實(shí)施方案
- 插圖幻燈片制作PPT3D小人圖標(biāo)幻燈素材(精)
- 室內(nèi)設(shè)計(jì)裝飾材料案例分析課件
評(píng)論
0/150
提交評(píng)論