類(lèi)圖之間關(guān)系_第1頁(yè)
類(lèi)圖之間關(guān)系_第2頁(yè)
類(lèi)圖之間關(guān)系_第3頁(yè)
類(lèi)圖之間關(guān)系_第4頁(yè)
類(lèi)圖之間關(guān)系_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在UML 2.0的13種圖形中,類(lèi)圖是使用頻率最高的UML圖之一。Martin Fowler在其著作UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition(UML精粹:標(biāo)準(zhǔn)對(duì)象建模語(yǔ)言簡(jiǎn)明指南(第3版)中有這么一段:“If someone were to come up to you in a dark alley and say, Psst, wanna see a UML diagram? that diagram would probably be a class diagr

2、am. The majority of UML diagrams I see are class diagrams.”(“如果有人在黑暗的小巷中向你走來(lái)并對(duì)你說(shuō):嘿,想不想看一張UML圖?那么這張圖很有可能就是一張類(lèi)圖,我所見(jiàn)過(guò)的大部分的UML圖都是類(lèi)圖”),由此可見(jiàn)類(lèi)圖的重要性。類(lèi)圖用于描述系統(tǒng)中所包含的類(lèi)以及它們之間的相互關(guān)系,幫助人們簡(jiǎn)化對(duì)系統(tǒng)的理解,它是系統(tǒng)分析和設(shè)計(jì)階段的重要產(chǎn)物,也是系統(tǒng)編碼和測(cè)試的重要模型依據(jù)。1. 類(lèi)類(lèi)(Class)封裝了數(shù)據(jù)和行為,是面向?qū)ο蟮闹匾M成部分,它是具有相同屬性、操作、關(guān)系的對(duì)象集合的總稱(chēng)。在系統(tǒng)中,每個(gè)類(lèi)都具有一定的職責(zé),職責(zé)指的是類(lèi)要完成什么樣

3、的功能,要承擔(dān)什么樣的義務(wù)。一個(gè)類(lèi)可以有多種職責(zé),設(shè)計(jì)得好的類(lèi)一般只有一種職責(zé)。在定義類(lèi)的時(shí)候,將類(lèi)的職責(zé)分解成為類(lèi)的屬性和操作(即方法)。類(lèi)的屬性即類(lèi)的數(shù)據(jù)職責(zé),類(lèi)的操作即類(lèi)的行為職責(zé)。設(shè)計(jì)類(lèi)是面向?qū)ο笤O(shè)計(jì)中最重要的組成部分,也是最復(fù)雜和最耗時(shí)的部分。在軟件系統(tǒng)運(yùn)行時(shí),類(lèi)將被實(shí)例化成對(duì)象(Object),對(duì)象對(duì)應(yīng)于某個(gè)具體的事物,是類(lèi)的實(shí)例(Instance)。類(lèi)圖(Class Diagram)使用出現(xiàn)在系統(tǒng)中的不同類(lèi)來(lái)描述系統(tǒng)的靜態(tài)結(jié)構(gòu),它用來(lái)描述不同的類(lèi)以及它們之間的關(guān)系。在系統(tǒng)分析與設(shè)計(jì)階段,類(lèi)通??梢苑譃槿N,分別是實(shí)體類(lèi)(Entity Class)、控制類(lèi)(Control Clas

4、s)和邊界類(lèi)(Boundary Class),下面對(duì)這三種類(lèi)加以簡(jiǎn)要說(shuō)明:(1) 實(shí)體類(lèi):實(shí)體類(lèi)對(duì)應(yīng)系統(tǒng)需求中的每個(gè)實(shí)體,它們通常需要保存在永久存儲(chǔ)體中,一般使用數(shù)據(jù)庫(kù)表或文件來(lái)記錄,實(shí)體類(lèi)既包括存儲(chǔ)和傳遞數(shù)據(jù)的類(lèi),還包括操作數(shù)據(jù)的類(lèi)。實(shí)體類(lèi)來(lái)源于需求說(shuō)明中的名詞,如學(xué)生、商品等。(2) 控制類(lèi):控制類(lèi)用于體現(xiàn)應(yīng)用程序的執(zhí)行邏輯,提供相應(yīng)的業(yè)務(wù)操作,將控制類(lèi)抽象出來(lái)可以降低界面和數(shù)據(jù)庫(kù)之間的耦合度??刂祁?lèi)一般是由動(dòng)賓結(jié)構(gòu)的短語(yǔ)(動(dòng)詞+名詞)轉(zhuǎn)化來(lái)的名詞,如增加商品對(duì)應(yīng)有一個(gè)商品增加類(lèi),注冊(cè)對(duì)應(yīng)有一個(gè)用戶注冊(cè)類(lèi)等(3) 邊界類(lèi):邊界類(lèi)用于對(duì)外部用戶與系統(tǒng)之間的交互對(duì)象進(jìn)行抽象,主要包括界面類(lèi),如

5、對(duì)話框、窗口、菜單等。在面向?qū)ο蠓治龊驮O(shè)計(jì)的初級(jí)階段,通常首先識(shí)別出實(shí)體類(lèi),繪制初始類(lèi)圖,此時(shí)的類(lèi)圖也可稱(chēng)為領(lǐng)域模型,包括實(shí)體類(lèi)及其它們之間的相互關(guān)系。2. 類(lèi)的UML圖示在UML中,類(lèi)使用包含類(lèi)名、屬性和操作且?guī)в蟹指艟€的長(zhǎng)方形來(lái)表示,如定義一個(gè)Employee類(lèi),它包含屬性name、age和email,以及操作modifyInfo(),在UML類(lèi)圖中該類(lèi)如圖1所示:圖1 類(lèi)的UML圖示圖1對(duì)應(yīng)的Java代碼片段如下:public class Employee private String name;private int age;private String email;public vo

6、id modifyInfo() .在UML類(lèi)圖中,類(lèi)一般由三部分組成:(1) 第一部分是類(lèi)名:每個(gè)類(lèi)都必須有一個(gè)名字,類(lèi)名是一個(gè)字符串。(2) 第二部分是類(lèi)的屬性(Attributes):屬性是指類(lèi)的性質(zhì),即類(lèi)的成員變量。一個(gè)類(lèi)可以有任意多個(gè)屬性,也可以沒(méi)有屬性UML規(guī)定屬性的表示方式為:可見(jiàn)性 名稱(chēng):類(lèi)型 = 缺省值 其中: “可見(jiàn)性”表示該屬性對(duì)于類(lèi)外的元素而言是否可見(jiàn),包括公有(public)、私有(private)和受保護(hù)(protected)三種,在類(lèi)圖中分別用符號(hào)+、-和#表示。 “名稱(chēng)”表示屬性名,用一個(gè)字符串表示。 “類(lèi)型”表示屬性的數(shù)據(jù)類(lèi)型,可以是基本數(shù)據(jù)類(lèi)型,也可以是用戶自

7、定義類(lèi)型。 “缺省值”是一個(gè)可選項(xiàng),即屬性的初始值。(3) 第三部分是類(lèi)的操作(Operations):操作是類(lèi)的任意一個(gè)實(shí)例對(duì)象都可以使用的行為,是類(lèi)的成員方法。UML規(guī)定操作的表示方式為:可見(jiàn)性 名稱(chēng)(參數(shù)列表) : 返回類(lèi)型其中: “可見(jiàn)性”的定義與屬性的可見(jiàn)性定義相同。 “名稱(chēng)”即方法名,用一個(gè)字符串表示。 “參數(shù)列表”表示方法的參數(shù),其語(yǔ)法與屬性的定義相似,參數(shù)個(gè)數(shù)是任意的,多個(gè)參數(shù)之間用逗號(hào)“,”隔開(kāi)。 “返回類(lèi)型”是一個(gè)可選項(xiàng),表示方法的返回值類(lèi)型,依賴(lài)于具體的編程語(yǔ)言,可以是基本數(shù)據(jù)類(lèi)型,也可以是用戶自定義類(lèi)型,還可以是空類(lèi)型(void),如果是構(gòu)造方法,則無(wú)返回類(lèi)型。在類(lèi)圖2

8、中,操作method1的可見(jiàn)性為public(+),帶入了一個(gè)Object類(lèi)型的參數(shù)par,返回值為空(void);操作method2的可見(jiàn)性為protected(#),無(wú)參數(shù),返回值為String類(lèi)型;操作method3的可見(jiàn)性為private(-),包含兩個(gè)參數(shù),其中一個(gè)參數(shù)為int類(lèi)型,另一個(gè)為int類(lèi)型,返回值為int類(lèi)型。圖2 類(lèi)圖操作說(shuō)明示意圖由于在Java語(yǔ)言中允許出現(xiàn)內(nèi)部類(lèi),因此可能會(huì)出現(xiàn)包含四個(gè)部分的類(lèi)圖,如圖3所示:圖3 包含內(nèi)部類(lèi)的類(lèi)圖類(lèi)與類(lèi)之間的關(guān)系(1)在軟件系統(tǒng)中,類(lèi)并不是孤立存在的,類(lèi)與類(lèi)之間存在各種關(guān)系,對(duì)于不同類(lèi)型的關(guān)系,UML提供了不同的表示方式。1. 關(guān)聯(lián)

9、關(guān)系關(guān)聯(lián)(Association)關(guān)系是類(lèi)與類(lèi)之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一類(lèi)對(duì)象與另一類(lèi)對(duì)象之間有聯(lián)系,如汽車(chē)和輪胎、師傅和徒弟、班級(jí)和學(xué)生等等。在UML類(lèi)圖中,用實(shí)線連接有關(guān)聯(lián)關(guān)系的對(duì)象所對(duì)應(yīng)的類(lèi),在使用Java、C#和C+等編程語(yǔ)言實(shí)現(xiàn)關(guān)聯(lián)關(guān)系時(shí),通常將一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)的成員變量。在使用類(lèi)圖表示關(guān)聯(lián)關(guān)系時(shí)可以在關(guān)聯(lián)線上標(biāo)注角色名,一般使用一個(gè)表示兩者之間關(guān)系的動(dòng)詞或者名詞表示角色名(有時(shí)該名詞為實(shí)例對(duì)象名),關(guān)系的兩端代表兩種不同的角色,因此在一個(gè)關(guān)聯(lián)關(guān)系中可以包含兩個(gè)角色名,角色名不是必須的,可以根據(jù)需要增加,其目的是使類(lèi)之間的關(guān)系更加明確。如在一個(gè)登錄界

10、面類(lèi)LoginForm中包含一個(gè)JButton類(lèi)型的注冊(cè)按鈕loginButton,它們之間可以表示為關(guān)聯(lián)關(guān)系,代碼實(shí)現(xiàn)時(shí)可以在LoginForm中定義一個(gè)名為loginButton的屬性對(duì)象,其類(lèi)型為JButton。如圖1所示:圖1 關(guān)聯(lián)關(guān)系實(shí)例圖1對(duì)應(yīng)的Java代碼片段如下:public class LoginForm private JButton loginButton; /定義為成員變量public class JButton 在UML中,關(guān)聯(lián)關(guān)系通常又包含如下幾種形式:(1) 雙向關(guān)聯(lián)默認(rèn)情況下,關(guān)聯(lián)是雙向的。例如:顧客(Customer)購(gòu)買(mǎi)商品(Product)并擁有商品,反之

11、,賣(mài)出的商品總有某個(gè)顧客與之相關(guān)聯(lián)。因此,Customer類(lèi)和Product類(lèi)之間具有雙向關(guān)聯(lián)關(guān)系,如圖2所示:圖2 雙向關(guān)聯(lián)實(shí)例圖2對(duì)應(yīng)的Java代碼片段如下:public class Customer private Product products;public class Product private Customer customer;(2) 單向關(guān)聯(lián)類(lèi)的關(guān)聯(lián)關(guān)系也可以是單向的,單向關(guān)聯(lián)用帶箭頭的實(shí)線表示。例如:顧客(Customer)擁有地址(Address),則Customer類(lèi)與Address類(lèi)具有單向關(guān)聯(lián)關(guān)系,如圖3所示:圖3 單向關(guān)聯(lián)實(shí)例圖3對(duì)應(yīng)的Java代碼片段如下:p

12、ublic class Customer private Address address;public class Address (3) 自關(guān)聯(lián)在系統(tǒng)中可能會(huì)存在一些類(lèi)的屬性對(duì)象類(lèi)型為該類(lèi)本身,這種特殊的關(guān)聯(lián)關(guān)系稱(chēng)為自關(guān)聯(lián)。例如:一個(gè)節(jié)點(diǎn)類(lèi)(Node)的成員又是節(jié)點(diǎn)Node類(lèi)型的對(duì)象,如圖4所示:圖4 自關(guān)聯(lián)實(shí)例圖4對(duì)應(yīng)的Java代碼片段如下:public class Node private Node subNode;(4) 多重性關(guān)聯(lián)多重性關(guān)聯(lián)關(guān)系又稱(chēng)為重?cái)?shù)性(Multiplicity)關(guān)聯(lián)關(guān)系,表示兩個(gè)關(guān)聯(lián)對(duì)象在數(shù)量上的對(duì)應(yīng)關(guān)系。在UML中,對(duì)象之間的多重性可以直接在關(guān)聯(lián)直線上用一個(gè)數(shù)

13、字或一個(gè)數(shù)字范圍表示。對(duì)象之間可以存在多種多重性關(guān)聯(lián)關(guān)系,常見(jiàn)的多重性表示方式如表1所示:表1 多重性表示方式列表表示方式多重性說(shuō)明1.1表示另一個(gè)類(lèi)的一個(gè)對(duì)象只與該類(lèi)的一個(gè)對(duì)象有關(guān)系0.*表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的零個(gè)或多個(gè)對(duì)象有關(guān)系1.*表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)的一個(gè)或多個(gè)對(duì)象有關(guān)系0.1表示另一個(gè)類(lèi)的一個(gè)對(duì)象沒(méi)有或只與該類(lèi)的一個(gè)對(duì)象有關(guān)系m.n表示另一個(gè)類(lèi)的一個(gè)對(duì)象與該類(lèi)最少m,最多n個(gè)對(duì)象有關(guān)系 (mn)例如:一個(gè)界面(Form)可以擁有零個(gè)或多個(gè)按鈕(Button),但是一個(gè)按鈕只能屬于一個(gè)界面,因此,一個(gè)Form類(lèi)的對(duì)象可以與零個(gè)或多個(gè)Button類(lèi)的對(duì)象相關(guān)聯(lián),但一個(gè)Bu

14、tton類(lèi)的對(duì)象只能與一個(gè)Form類(lèi)的對(duì)象關(guān)聯(lián),如圖5所示:圖5 多重性關(guān)聯(lián)實(shí)例圖5對(duì)應(yīng)的Java代碼片段如下:public class Form private Button buttons; /定義一個(gè)集合對(duì)象public class Button (5) 聚合關(guān)系聚合(Aggregation)關(guān)系表示整體與部分的關(guān)系。在聚合關(guān)系中,成員對(duì)象是整體對(duì)象的一部分,但是成員對(duì)象可以脫離整體對(duì)象獨(dú)立存在。在UML中,聚合關(guān)系用帶空心菱形的直線表示。例如:汽車(chē)發(fā)動(dòng)機(jī)(Engine)是汽車(chē)(Car)的組成部分,但是汽車(chē)發(fā)動(dòng)機(jī)可以獨(dú)立存在,因此,汽車(chē)和發(fā)動(dòng)機(jī)是聚合關(guān)系,如圖6所示:圖6 聚合關(guān)系實(shí)例在

15、代碼實(shí)現(xiàn)聚合關(guān)系時(shí),成員對(duì)象通常作為構(gòu)造方法、Setter方法或業(yè)務(wù)方法的參數(shù)注入到整體對(duì)象中,圖6對(duì)應(yīng)的Java代碼片段如下:public class Car private Engine engine; /構(gòu)造注入public Car(Engine engine) this.engine = engine; /設(shè)值注入public void setEngine(Engine engine) this.engine = engine;public class Engine (6) 組合關(guān)系組合(Composition)關(guān)系也表示類(lèi)之間整體和部分的關(guān)系,但是在組合關(guān)系中整體對(duì)象可以控制成員對(duì)象

16、的生命周期,一旦整體對(duì)象不存在,成員對(duì)象也將不存在,成員對(duì)象與整體對(duì)象之間具有同生共死的關(guān)系。在UML中,組合關(guān)系用帶實(shí)心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒(méi)了,嘴巴也就沒(méi)了,因此頭和嘴巴是組合關(guān)系,如圖7所示:圖7 組合關(guān)系實(shí)例在代碼實(shí)現(xiàn)組合關(guān)系時(shí),通常在整體類(lèi)的構(gòu)造方法中直接實(shí)例化成員類(lèi),圖7對(duì)應(yīng)的Java代碼片段如下:public class Head private Mouth mouth;public Head() mouth = new Mouth(); /實(shí)例化成員類(lèi)public class Mouth 類(lèi)與類(lèi)之間的關(guān)

17、系(2)2. 依賴(lài)關(guān)系依賴(lài)(Dependency)關(guān)系是一種使用關(guān)系,特定事物的改變有可能會(huì)影響到使用該事物的其他事物,在需要表示一個(gè)事物使用另一個(gè)事物時(shí)使用依賴(lài)關(guān)系。大多數(shù)情況下,依賴(lài)關(guān)系體現(xiàn)在某個(gè)類(lèi)的方法使用另一個(gè)類(lèi)的對(duì)象作為參數(shù)。在UML中,依賴(lài)關(guān)系用帶箭頭的虛線表示,由依賴(lài)的一方指向被依賴(lài)的一方。例如:駕駛員開(kāi)車(chē),在Driver類(lèi)的drive()方法中將Car類(lèi)型的對(duì)象car作為一個(gè)參數(shù)傳遞,以便在drive()方法中能夠調(diào)用car的move()方法,且駕駛員的drive()方法依賴(lài)車(chē)的move()方法,因此類(lèi)Driver依賴(lài)類(lèi)Car,如圖1所示:圖1 依賴(lài)關(guān)系實(shí)例在系統(tǒng)實(shí)施階段,依賴(lài)

18、關(guān)系通常通過(guò)三種方式來(lái)實(shí)現(xiàn),第一種也是最常用的一種方式是如圖1所示的將一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)中方法的參數(shù),第二種方式是在一個(gè)類(lèi)的方法中將另一個(gè)類(lèi)的對(duì)象作為其局部變量,第三種方式是在一個(gè)類(lèi)的方法中調(diào)用另一個(gè)類(lèi)的靜態(tài)方法。圖1對(duì)應(yīng)的Java代碼片段如下:public class Driver public void drive(Car car) car.move(); public class Car public void move() . 3. 泛化關(guān)系泛化(Generalization)關(guān)系也就是繼承關(guān)系,用于描述父類(lèi)與子類(lèi)之間的關(guān)系,父類(lèi)又稱(chēng)作基類(lèi)或超類(lèi),子類(lèi)又稱(chēng)作派生類(lèi)。在UML中,泛

19、化關(guān)系用帶空心三角形的直線來(lái)表示。在代碼實(shí)現(xiàn)時(shí),我們使用面向?qū)ο蟮睦^承機(jī)制來(lái)實(shí)現(xiàn)泛化關(guān)系,如在Java語(yǔ)言中使用extends關(guān)鍵字、在C+/C#中使用冒號(hào)“:”來(lái)實(shí)現(xiàn)。例如:Student類(lèi)和Teacher類(lèi)都是Person類(lèi)的子類(lèi),Student類(lèi)和Teacher類(lèi)繼承了Person類(lèi)的屬性和方法,Person類(lèi)的屬性包含姓名(name)和年齡(age),每一個(gè)Student和Teacher也都具有這兩個(gè)屬性,另外Student類(lèi)增加了屬性學(xué)號(hào)(studentNo),Teacher類(lèi)增加了屬性教師編號(hào)(teacherNo),Person類(lèi)的方法包括行走move()和說(shuō)話say(),Stud

20、ent類(lèi)和Teacher類(lèi)繼承了這兩個(gè)方法,而且Student類(lèi)還新增方法study(),Teacher類(lèi)還新增方法teach()。如圖2所示:圖2 泛化關(guān)系實(shí)例圖2對(duì)應(yīng)的Java代碼片段如下:/父類(lèi)public class Person protected String name;protected int age;public void move() public void say() /子類(lèi)public class Student extends Person private String studentNo;public void study() /子類(lèi)public class Tea

21、cher extends Person private String teacherNo;public void teach() 4. 接口與實(shí)現(xiàn)關(guān)系在很多面向?qū)ο笳Z(yǔ)言中都引入了接口的概念,如Java、C#等,在接口中,通常沒(méi)有屬性,而且所有的操作都是抽象的,只有操作的聲明,沒(méi)有操作的實(shí)現(xiàn)。UML中用與類(lèi)的表示法類(lèi)似的方式表示接口,如圖3所示:圖3 接口的UML圖示接口之間也可以有與類(lèi)之間關(guān)系類(lèi)似的繼承關(guān)系和依賴(lài)關(guān)系,但是接口和類(lèi)之間還存在一種實(shí)現(xiàn)(Realization)關(guān)系,在這種關(guān)系中,類(lèi)實(shí)現(xiàn)了接口,類(lèi)中的操作實(shí)現(xiàn)了接口中所聲明的操作。在UML中,類(lèi)與接口之間的實(shí)現(xiàn)關(guān)系用帶空心三角形的虛

22、線來(lái)表示。例如:定義了一個(gè)交通工具接口Vehicle,包含一個(gè)抽象操作move(),在類(lèi)Ship和類(lèi)Car中都實(shí)現(xiàn)了該move()操作,不過(guò)具體的實(shí)現(xiàn)細(xì)節(jié)將會(huì)不一樣,如圖4所示:圖4 實(shí)現(xiàn)關(guān)系實(shí)例實(shí)現(xiàn)關(guān)系在編程實(shí)現(xiàn)時(shí),不同的面向?qū)ο笳Z(yǔ)言也提供了不同的語(yǔ)法,如在Java語(yǔ)言中使用implements關(guān)鍵字,而在C+/C#中使用冒號(hào)“:”來(lái)實(shí)現(xiàn)。圖4對(duì)應(yīng)的Java代碼片段如下:public interface Vehicle public void move();public class Ship implements Vehicle public void move() public class

23、 Car implements Vehicle public void move() 實(shí)例分析1登錄模塊某基于C/S的即時(shí)聊天系統(tǒng)登錄模塊功能描述如下:用戶通過(guò)登錄界面(LoginForm)輸入賬號(hào)和密碼,系統(tǒng)將輸入的賬號(hào)和密碼與存儲(chǔ)在數(shù)據(jù)庫(kù)(User)表中的用戶信息進(jìn)行比較,驗(yàn)證用戶輸入是否正確,如果輸入正確則進(jìn)入主界面(MainForm),否則提示“輸入錯(cuò)誤”。根據(jù)以上描述繪制初始類(lèi)圖。參考解決方案:參考類(lèi)圖如下:考慮到系統(tǒng)擴(kuò)展性,在本實(shí)例中引入了抽象數(shù)據(jù)訪問(wèn)接口IUserDAO,再將具體數(shù)據(jù)訪問(wèn)對(duì)象注入到業(yè)務(wù)邏輯對(duì)象中,可通過(guò)配置文件(如XML文件)等方式來(lái)實(shí)現(xiàn),將具體的數(shù)據(jù)訪問(wèn)類(lèi)類(lèi)名存

24、儲(chǔ)在配置文件中,如果需要更換新的具體數(shù)據(jù)訪問(wèn)對(duì)象,只需修改配置文件即可,原有程序代碼無(wú)須做任何修改。類(lèi)說(shuō)明:類(lèi) 名說(shuō) 明LoginForm登錄窗口,省略界面組件和按鈕事件處理方法(邊界類(lèi))LoginBO登錄業(yè)務(wù)邏輯類(lèi),封裝實(shí)現(xiàn)登錄功能的業(yè)務(wù)邏輯(控制類(lèi))IUserDAO抽象數(shù)據(jù)訪問(wèn)類(lèi)接口,聲明對(duì)User表的數(shù)據(jù)操作方法,省略除查詢(xún)外的其他方法(實(shí)體類(lèi))UserDAO具體數(shù)據(jù)訪問(wèn)類(lèi),實(shí)現(xiàn)對(duì)User表的數(shù)據(jù)操作方法,省略除查詢(xún)外的其他方法(實(shí)體類(lèi))MainForm主窗口(邊界類(lèi))方法說(shuō)明:方法名說(shuō) 明LoginForm類(lèi)的LoginForm()方法LoginForm構(gòu)造函數(shù),初始化實(shí)例成員Logi

25、nForm類(lèi)的validate()方法界面類(lèi)的驗(yàn)證方法,通過(guò)調(diào)用業(yè)務(wù)邏輯類(lèi)LoginBO的validate()方法實(shí)現(xiàn)對(duì)用戶輸入信息的驗(yàn)證LoginBO類(lèi)的validate()方法業(yè)務(wù)邏輯類(lèi)的驗(yàn)證方法,通過(guò)調(diào)用數(shù)據(jù)訪問(wèn)類(lèi)的findUserByAccAndPwd()方法驗(yàn)證用戶輸入信息的合法性LoginBO類(lèi)的setIUserDAO()方法Setter方法,在業(yè)務(wù)邏輯對(duì)象中注入數(shù)據(jù)訪問(wèn)對(duì)象(注意:此處針對(duì)抽象數(shù)據(jù)訪問(wèn)類(lèi)編程IUserDAO接口的findUserByAccAndPwd()方法業(yè)務(wù)方法聲明,通過(guò)用戶賬號(hào)和密碼在數(shù)據(jù)庫(kù)中查詢(xún)用戶信息,判斷該用戶身份的合法性UserDAO類(lèi)的findUs

26、erByAccAndPwd()方法業(yè)務(wù)方法實(shí)現(xiàn),實(shí)現(xiàn)在IUserDAO接口中聲明的數(shù)據(jù)訪問(wèn)方法實(shí)例分析2注冊(cè)模塊某基于Java語(yǔ)言的C/S軟件需要提供注冊(cè)功能,該功能簡(jiǎn)要描述如下:用戶通過(guò)注冊(cè)界面(RegisterForm)輸入個(gè)人信息,用戶點(diǎn)擊“注冊(cè)”按鈕后將輸入的信息通過(guò)一個(gè)封裝用戶輸入數(shù)據(jù)的對(duì)象(UserDTO)傳遞給操作數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn)類(lèi),為了提高系統(tǒng)的擴(kuò)展性,針對(duì)不同的數(shù)據(jù)庫(kù)可能需要提供不同的數(shù)據(jù)訪問(wèn)類(lèi),因此提供了數(shù)據(jù)訪問(wèn)類(lèi)接口,如IUserDAO,每一個(gè)具體數(shù)據(jù)訪問(wèn)類(lèi)都是某一個(gè)數(shù)據(jù)訪問(wèn)類(lèi)接口的實(shí)現(xiàn)類(lèi),如OracleUserDAO就是一個(gè)專(zhuān)門(mén)用于訪問(wèn)Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn)類(lèi)。根

27、據(jù)以上描述繪制類(lèi)圖。為了簡(jiǎn)化類(lèi)圖,個(gè)人信息僅包括賬號(hào)(userAccount)和密碼(userPassword),且界面類(lèi)無(wú)需涉及界面細(xì)節(jié)元素。參考解決方案:在以上功能說(shuō)明中,可以分析出該系統(tǒng)包括三個(gè)類(lèi)和一個(gè)接口,這三個(gè)類(lèi)分別是注冊(cè)界面類(lèi)RegisterForm、用戶數(shù)據(jù)傳輸類(lèi)UserDTO、Oracle用戶數(shù)據(jù)訪問(wèn)類(lèi)OracleUserDAO,接口是抽象用戶數(shù)據(jù)訪問(wèn)接口IUserDAO。它們之間的關(guān)系如下:(1) 在RegisterForm中需要使用UserDTO類(lèi)傳輸數(shù)據(jù)且需要使用數(shù)據(jù)訪問(wèn)類(lèi)來(lái)操作數(shù)據(jù)庫(kù),因此RegisterForm與UserDTO和IUserDAO之間存在關(guān)聯(lián)關(guān)系,在Re

28、gisterForm中可以直接實(shí)例化UserDTO,因此它們之間可以使用組合關(guān)聯(lián)。(2) 由于數(shù)據(jù)庫(kù)類(lèi)型需要靈活更換,因此在RegisterForm中不能直接實(shí)例化IUserDAO的子類(lèi),可以針對(duì)接口IUserDAO編程,再通過(guò)注入的方式傳入一個(gè)IUserDAO接口的子類(lèi)對(duì)象(在本書(shū)后續(xù)章節(jié)中將學(xué)習(xí)如何具體實(shí)現(xiàn)),因此RegisterForm和IUserDAO之間具有聚合關(guān)聯(lián)關(guān)系。(3) OracleUserDAO是實(shí)現(xiàn)了IUserDAO接口的子類(lèi),因此它們之間具有類(lèi)與接口的實(shí)現(xiàn)關(guān)系。(4) 在聲明IUserDAO接口的增加用戶信息方法addUser()時(shí),需要將在界面類(lèi)中實(shí)例化的UserDT

29、O對(duì)象作為參數(shù)傳遞進(jìn)來(lái),然后取出封裝在UserDTO對(duì)象中的數(shù)據(jù)插入數(shù)據(jù)庫(kù),因此addUser()方法的函數(shù)原型可以定義為:public boolean addUser(UserDTO user),在IUserDAO的方法addUser()中將UserDTO類(lèi)型的對(duì)象作為參數(shù),故IUserDAO與UserDTO存在依賴(lài)關(guān)系。通過(guò)以上分析,該實(shí)例參考類(lèi)圖如圖1所示:圖1 注冊(cè)功能參考類(lèi)圖注意:在繪制類(lèi)圖或其他UML圖形時(shí),可以通過(guò)注釋(Comment)來(lái)對(duì)圖中的符號(hào)或元素進(jìn)行一些附加說(shuō)明,如果需要詳細(xì)說(shuō)明類(lèi)圖中的某一方法的功能或者實(shí)現(xiàn)過(guò)程,可以使用如圖2所示表示方式:圖2 類(lèi)圖注釋實(shí)例實(shí)例分析3售票機(jī)控制程序某運(yùn)輸公司決定為新的售票機(jī)開(kāi)發(fā)車(chē)票銷(xiāo)售的控制軟件。圖I給出了售票機(jī)的面板示意圖以及相關(guān)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論