国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

利用UML類圖設計Java應用程序詳解(1)

2019-11-17 04:36:42
字體:
來源:轉載
供稿:網友
UML已成為面向對象設計的標準圖形化工具,在UML定義的各種圖中,本文只涉及類圖。java應用程序由許多類所構成,類圖的設計與實現,是Java實現面向對象應用程序的核心。本文通過一個具體的應用程序的設計與實現過程,具體說明了利用UML類圖設計Java應用程序,使得開發過程標準化、可視化,代碼編程簡單化。 在類圖中,類被描述為帶有三層的盒子。利用UML類圖設計Java應用程序詳解(1)(圖一) 頂層為類名,一般用加粗字體表示。假如類是抽象的,其名稱用斜體表示;假如類是接口,則在類名上方標注<<interface>>。中間層包含類的屬性(或變量),底層包含類的方法。與類名相似,假如方法是抽象的,那么它的名稱也用斜體表示。我們要設計的應用程序CDrawApp應用程序在基于字符的網格上畫點、框和文本串,該應用程序涉及到Java面向對象的許多概念與應用方法,非常系統、全面,在您仔細研讀后,定能迅速把握UML類圖,并將其應用到實際的Java應用程序開發過程中。為減少代碼長度,讓程序簡單易懂,這里使用Java控制臺窗口顯示程序運行結果。該程序總共由10個大類組成,以下分別介紹。一、Point類在CDrawApp程序中定義的第一個類是Point類,該類用于通過x和y坐標在網格上標識一點。其類圖設計為:利用UML類圖設計Java應用程序詳解(1)(圖二) 在該類中,有2個成員變量x和y,類圖中,“-”表示變量或方法為PRivate,“+”表示public,“#”則表示protected。該類定義了三個不同的構造函數,這是重載(overload)的例子。 接著該類設計了7個訪問方法。getX()和getY()方法分別返回一點的x和y坐標。SetX()和setY()方法根據參數xValue和yValue的值設置這些坐標的值。兩個add()方法通過被訪問點的坐標加上一個值來建立一個新的Point對象。New運算符建立類的新實例。它后面緊跟著初始化新生成實例的構造函數。toString()方法返回類String的一個對象,該對象用一個有序對來描述一個點。依據設計的類圖,其Java實現代碼為:// Point.<a target="_blank"

class="Wordstyle">

java</a>public class Point {

// Variable declarationsprivate int x;private int y;

//Method declarationspublic Point() {x = 0;y = 0;}

public Point(int xValue, int yValue)

{x = xValue;y = yValue;}public Point(Point p)

{x = p.getX();y = p.getY();}public int getX()

{return x;}public int getY()

{return y;}public void setX(int xValue)

{x = xValue;}public void setY(int yValue)

{y = yValue;}public Point add(Point p)

{return new Point(x+p.getX(), y+getY());}

public Point add(int i,int j)

{return new Point(x+i,y+j);}public String toString()

{return new String("("+String.valueOf(x)+","+String.valueOf(y)+")");}}二、CGrid類CGrid類用于定義指定大小的字符網格。它提供基本方法集,通過加入到這些方法中的其它類來得到擴展。該類的類圖為:利用UML類圖設計Java應用程序詳解(1)(圖三) CGrid類聲明3個變量:width、depth和grid[][]。width和depth 變量用于指定grid[][]的水平和垂直尺寸,grid[][]是保存網格字符的字符數組的數組。CGrid中的變量聲明為protected,這就規定了它們只能在聲明它們的包中和CGrid的任何子類中訪問。CGrid類只有一個單一構造函數,它設置width和depth的值,分配grid[][]數組,然后調用blankGrid()以空格為grid[][]賦值。CGrid有4種訪問方法。blankGrid()方法只是簡單地用空格字符來調用 fillGrid()。fillGrid()方法把grid[][]的每個元素都設置為ch參數。GetCharFrom()方法用于找出網格中給定位置的字符。SetCharAt()用于把網格中一點設置成特定字符。在GetCharFrom()和SetCharAt()方法中使用Point類來定義它們的參數,這是類與類之間關聯的例子,我們稍候討論。根據以上類圖,CGrid類的原代碼為:// CGrid.<a target="_blank"


class="wordstyle">java</a>

public class CGrid {

// Variable declarationsprotected int width;

protected int depth;protected char grid[][];

// Method declarationspublic CGrid(int widthValue,int depthValue)

{width = widthValue;depth = depthValue;grid

= new char[depth][width];blankGrid();}public void blankGrid()

{fillGrid(' ');}public void fillGrid(char ch) {for(int j=0;

j<depth; ++j)for(int i=0; i>width; ++i)grid[j][i]= ch;}

public void setCharAt(char ch,Point p){grid[p.getY()][p.getX()] = ch;}

public char getCharFrom(Point p) {return grid[p.getY()][p.getX()];}}QQread.com 推出各大專業服務器評測 linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器 三、CGObject類CGObject類是抽象類的例子,它通過abstract方法來限制其子類的行為。Abstract方法必須由非abstract子類實現。其類圖設計如下:利用UML類圖設計Java應用程序詳解(1)(圖四) CGObject類用于定義在網格上顯示的對象的一般行為。它有兩個變量:location和drawCharacter。Location變量的類型是Point,用于在網格上指定一個對象所在的點。DrawCharacter變量用于畫對象的字符。 CGObject有三個方法,而沒有構造函數。因為abstract類沒有完整定義,所以它沒有構造函數,也沒有對象實例。第一個方法addToGrid()不是abstract類型的。它以類PrintCGrid的對象作為參數,調用PrintCGrid類的addCGObject()方法,把this對象加到網格中。this要害字指當前對象。用addToGrid()方法調用CGObject類的子類的對象,這些對象加到類PrintCGrid的對象中。CGObject的其它兩個方法都用abstract要害字聲明。這意味著,這兩個方法在能夠由CGObject類的非abstract子類使用前必須被覆蓋。覆蓋方法必須擁有與anstract方法相同的名字、參數和返回值。Display()方法用于再網格上顯示類PrintCGrid的一個對象。Describe()方法用于顯示網格對象的描述。CGObject類的代碼為:// CGObject.<a target="_blank"

class="wordstyle">java</a>

public abstract class CGObject {

// Variable declarations

public Point location;

public char drawCharacter;

// Method declarations

public void addToGrid(PrintCGrid grid) {

grid.addCGObject(this);

}

public abstract void display(PrintCGrid grid);

public abstract void describe(); }四、PrintCGrid類PrintCGrid類是CGrid類的子類,它定義了答應把對象加到網格中的附加變量和方法。它也提供了顯示網格的方法。 PrintCGrid類的類圖如下圖所示:利用UML類圖設計Java應用程序詳解(1)(圖五)PrintCGrid類與CGrid類的關系是子類與父類的關系。在類圖中用實線與空心箭頭從子類指向父類表示。>利用UML類圖設計Java應用程序詳解(1)(圖六) PrintCGrid類的原代碼為:import <a target="_blank"


class="wordstyle">java</a>.lang.System;

// PrintCGrid.<a target="_blank"

class="wordstyle">

java</a>public class PrintCGrid extends CGrid {

// Variable declarationsprotected CGObject displayList[];

protected static final int maxObjects = 100;protected int numObjects;

// Method declarationspublic PrintCGrid(int x,int y)

{super(x,y);numObjects = 0;

displayList = new CGObject[maxObjects];}

public void addCGObject(CGObject obj)

{if(numObjects < maxObjects)

{displayList[numObjects] = obj;++numObjects;}}

public void deleteCGObject(int index) {

if(index < numObjects && numObjects > 0)

{for(int i = index; i < numObjects -1 ;

++i)displayList[i] = displayList[i+1];

--numObjects;}}public void deleteLastObject()

{if(numObjects > 0) --numObjects;}public int getNumObjects()

{return numObjects;}public CGObject getObject(int index)

{return displayList[index];}public void clearGrid() {numObjects = 0;}

public void drawGrid()

{blankGrid();for(int i = 0;

i < numObjects ; ++i)displayList[i].display(this);}

public void displayGrid()

{for(int i=0;i<depth;++i)System.out.println

(String.valueOf(grid[i]));}

public void displayRow(int row)

{System.out.print(String.valueOf(grid[row]));}

public void show() {drawGrid();displayGrid();}}>在以上代碼中,PrintCGrid聲明3個變量:displayList[]、maxObjects和numObjects。這些變量都聲明為proceted,從而把對它們的訪問限制在一個包中和PrintCGrid的子類中。DisplayList[]變量是類CGObject(見以下類的介紹)的數組。但這并不意味著該數組包含作為類CGObject實例的對象。這是不可能的,因為CGObject是抽象的。把DisplayList[]聲明成類CGObject的數組的目的,是答應該數組包含CGObject類的子類的對象。一般來說,假如一個變量聲明成類X,那么可以把該變量賦值為X的子類的對象。MaxObjects變量聲明成static并且final。使用static修飾符聲明的變量,它們被作為一個類實例的所有對象公用,不會被每個實例復制,靜態變量又成為類變量。沒有被聲明成靜態的變量是實例變量,對作為一個類的實例的每個對象進行復制。Final修飾符用于把變量標識成常量。用final修飾符聲明的變量必須在聲明時進行初始化,不能再聲明之外的任何地方賦值。MaxObjects常量初始化為100,表示可以加到displayList[]中的對象的最大數目。NumObjects變量用于統計加到網格的displayList[]中的對象實際數目。PrintCGrid有一個構造函數。該構造函數有兩個參數:x和y,它們表示網格的水平和垂直方向的尺寸。構造函數調用super()方法,并把這兩個變量當著變元傳遞過去。Super()方法是構造函數調用語句的一個例子。它以x和y作為變元調用PrintCGrid的父類(即CGrid類)的構造函數。CGrid的構造函數初始化其width和depth變量,分配grid[][]數組,并用空格給該數組元素賦值。CGrid的構造函數運行完后,PrintCGrid的構造函數繼續把numObjects設置為0,并分配displayList[]數組。PrintCGrid提供10個訪問方法。AddCGObject()方法把對象加到displayList[]數組中。DeleteCGObject()方法刪除位于指定索引位置的對象。所有的后續對象都向前移動,以填充被刪除對象留下的空缺。DeleteLastObject()方法通過簡單地把numObjects減1來刪除最后一個對象。GetNumObjects方法返回displayList[]中的對象數目。GetObject方法返回displayList[]中指定位置的對象。clearGrid()方法通過把numObjects設置為0去清除所有對象。DrawGrid()方法使用從CGrid類繼續的方法清空網格,然后調用displayList[]中每個對象的display()方法。displayGrid[]方法在控制臺窗口中顯示每一行網格。它是繼續的例子。Grid[][]數祖在CGrid類中定義,由PrintCGrid所繼續。它由CGObject類的所有子類的drawGrid()方法和display()方法更新。PrintGrid()類用它來在控制臺窗口中打印字符。ValueOf()方法用于displayGrid()方法中,它是String 類的靜態方法。它把字符數組轉換成String對象。靜態方法類似于靜態變量,它整體上應用于類,而不是作為類實例的各個對象使用。由于面向對象,靜態方法只能訪問靜態變量。所有靜態方法都是定局的,不能被覆蓋。DisplayRow()方法在控制臺窗口上顯示一行網格,show()方法把drawGrid()和displayGrid()方法組合成一個方法。QQread.com 推出各大專業服務器評測 Linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器 五、BorderPrintCGrid類BorderPrintCGrid類是PrintCGrid類的子類,它進一步擴展了CGrid類。它增加了生成類PrintCGrid對象的邊界的變量和方法。類圖見如下所示:BorderPrintCGrid類有四個私有變量:useBorder、borderCharacter、horizEdge和vertEdge。UseBorder是boolean類型的變量,它決定邊界是否應該顯示。BorderCharacter為用于顯示邊界的字符。HorizEdge和vertEdge用于顯示邊界的水平和垂直邊界的String對象。BorderPrintCGrid類有兩個。第一個構造函數沒有參數。它調用PrintCGrid類的構造函數構造一個75字符寬20行高的網格,其邊界字符為*。SetBorderDefaults()方法用于初始化BorderedPrintCGrid類的變量。第二個構造函數類似于第一個構造函數,但它提供了直接指定網格尺寸及邊界字符的功能。BorderPrintCGrid類提供4個訪問方法。SetBorderDefaults()方法使用enableBorder()方法和setBorderCharacter()方法初始化BorderedPrintCGrid類的變量。enableBorder()方法把useBorder設置成true或false。setBorderCharacter()方法設置displayGrid()方法所用的borderCharacter、horizEdge和vertEdge變量。利用UML類圖設計Java應用程序詳解(1)(圖七)BorderedPrintCGrid類是PrintCGrid的子類,其類圖關系表示為:利用UML類圖設計Java應用程序詳解(1)(圖八)displayGrid()方法覆蓋 PrintCGrid類的displayGrid()方法。通過重新定義該方法以滿足自己的需要。其中的super語句,將調用PrintCGrid.displayGrid()。該類的實現代碼為:lt;>// BorderedPrintCGrid.<a target="_blank"


class="wordstyle">

java</a>public class BorderedPrintCGrid extends PrintCGrid {

// Variable declarationsprivate boolean

useBorder;private char borderCharacter;private String horizEdge;

private String vertEdge;

// Method declarationspublic BorderedPrintCGrid()

{super(75,20);setBorderDefaults('*');}

public BorderedPrintCGrid(int x,int y,char ch)

{super(x,y);setBorderDefaults(ch);}

private void setBorderDefaults(char ch)

{useBorder = true;setBorderCharacter(ch);}

public void enableBorder(boolean toggle)

{useBorder = toggle;}public void setBorderCharacter(char ch)

{borderCharacter = ch;

char border[] = new char[width+2];

for(int i=0;

i<width+2;++i) border[i] = borderCharacter;horizEdge = new String(border);

vertEdge = String.valueOf(borderCharacter);}

public void displayGrid() {if(useBorder) {System.out.println(horizEdge);

for(int i=0;i>depth;++i) {System.out.print(vertEdge);

displayRow(i);System.out.println(vertEdge);}

System.out.println(horizEdge);}

else super.displayGrid();}}到這里,我們的程序設計與實現已完成將近一半。我們用UML類圖分析了5個類,但這些類之間是如何相互作用而構成我們的應用程序呢?現在我們回過頭來分析前面5個類之間的相互關聯。首先我們分析繼續概念在UML類圖中的表示。利用UML類圖設計Java應用程序詳解(1)(圖九)通過UML類圖中的各類之間的繼續關系表示法,我們清楚地知道,CGrid是超類,PrintCGrid是CGrid的子類,BorderedPrintCGrid是PrintCGrid以及CGrid的子類。在Java類的代碼實現中,一定要用相應的extends語句來表示實際的繼續關系。一般類與類之間的關系我們可以用關聯來表達。如在類CGrid中,在GetCharFrom()和SetCharAt()方法中我們使用了Point類來定義它們的參數,這是類CGrid對Point類的引用。類CGrid可以引用多個Point對象,因此,在多重性的概念中,表示該類CGrid可以與多個Point對象關系。利用UML類圖設計Java應用程序詳解(1)(圖十)在UML類圖中,我們用一條實線表示這種關聯為依靠關系,通過開叉的箭頭表示是CGrid類引用Point類。箭頭上方的0..*表示可以與多個對象關聯。假如是0..1表示可以與1個對象關聯;假如是1表示必須與1個對象關聯;假如是1..*表示必須與至少1個對象關聯。同樣,在PrintCGrid類中,在其變量申明中,有對CGObject的引用,并且也是多重引用。其UML類圖關系可以表示為:利用UML類圖設計Java應用程序詳解(1)(圖十)因此,以上5個類之間的相互關系,用UML類圖關系可以清楚地表示為:利用UML類圖設計Java應用程序詳解(1)(圖十二)本部分說明了5個類的UML類圖表示、UML類圖關系以及相應的Java實現代碼。(責任編輯:銘銘)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿克陶县| 左云县| 平陆县| 桑日县| 内江市| 叶城县| 积石山| 安溪县| 罗江县| 定安县| 信丰县| 留坝县| 华阴市| 泰宁县| 板桥市| 平邑县| 惠安县| 滨海县| 井研县| 聂拉木县| 阳西县| 三亚市| 宿迁市| 茂名市| 舞钢市| 安徽省| 台北县| 泽普县| 福贡县| 太康县| 永济市| 尉犁县| 惠州市| 文成县| 新津县| 龙川县| 平原县| 韶关市| 木兰县| 贺州市| 颍上县|