天天看點

分析設計之類圖

類圖(Class Diagram):

分析設計之類圖

類(Class)封裝了資料和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。

類一般由三部分組成:

類名(Class):每個類都必須有一個名字,類名是一個字元串。 

屬性(Attributes):屬性是指類的性質,即類的成員變量。類可以有任意多個屬性,也可以沒有屬性。

  UML中:可見性 名稱:類型 [= 預設值]

操作(Operations):操作是類的任意一個執行個體對象都可以使用的行為,操作是類的成員方法。

  UML中:可見性 名稱(參數名):傳回值

分析設計之類圖

接下來我們看一下類的關系:

分析設計之類圖

要注意uml中的關系是面向對象關系。如果不以面向對象的思維去考慮會感覺到有很多關系認為是一樣的。

關聯關系(Association):

通常關聯關系用來實作連接配接有關聯的對象所對應的類,即将一個類的對象作為另一個類的屬性。

還有就是關聯關系可以是單向的也可以是雙向的。雙向的符号是沒有方向标的,隻是一條直線。

例:

單向:

分析設計之類圖

雙向:

分析設計之類圖

自己:

分析設計之類圖

多重性關聯關系:

分析設計之類圖
分析設計之類圖

在這裡要注意,看完此圖中1…1以後不要認為一個Form是對應一個Button的。

不是的,應該是一個Button是對應一個Form的。1..1是表示另一個類的一個對象隻與一個該類對象有關系。記住上面的表格。是另一個類與該類是什麼關系。

聚合關系(Aggregation):

表示整體與部分的關系。考慮到一個整體類的組成結構。找出成員類。即成員對象是整體對象的一部分,但是成員對象可以隊裡整體對象獨立存在。是以也有人說此關系是一種弱關系,那麼強關系是什麼後面我們會降到組成關系。

聚合關系有一個特點,那就是可替換。

分析設計之類圖

直覺的來看此圖Car中必須得有一個Engine,這樣才可以認為是一個完整體。

但是這個Engine是可替換的。是以傳參的形式給Car賦一個Engine。

再次強調一下聚合是可替換的。Car中必須有一個Engine,但是此Engine可以是一個抽象的具體的Engine是在當你使用Car時可以具體去找一個合适的Engine裝到Car上就行,如果沒有Engin那麼這個Car是跑不了。

組合關系(Composition):

表示整體與部分的關系。但是與聚合不同此關系是整體與部分是同生共死關系。即如果整體對象銷毀了部分也會被銷毀。

分析設計之類圖

上圖Head是整體Mouth是部分,如果Head沒了Mouth也跟着銷毀了。如果Mouth沒了Head也将是面目全非。在代碼中Head中Mouth是直接new出來的。

就是說當你去new Head時Mouth也被new出來。記住一同建立一同銷毀關系。也叫強關系。那麼有人會問關聯,聚合,組合我怎麼認為是一樣呢。

可以說他們是一樣的都可以說是關聯關系,是的,但是關聯關系的強弱來區分了一下關聯關系強度來看組合>聚合>關聯。

依賴關系(Dependency):

是一個使用關系。特定事物的改變有可能會影響到使用該事物的其他事物。簡單說在一個類中通過另外一個類來調用其方法的表示。

分析設計之類圖

從圖中可以看出Driver中使用了Car的move方法。那麼就說明Driver是依賴于Car才能做Driver的職責。那麼又有人會問聚合與依賴有差別嗎,當然很明顯Driver是一個整體,Car也是整體。不是整體與部分關系。

泛化關系(Generalization):

繼承(extends)關系,父類與子類關系。這個好了解直接上圖。

分析設計之類圖

從圖中可以看出Student也是Person,Teacher也是Person。他們有共同的特征name,age。但是也有獨自的特征一個是study一個是teach的特征。

子類那麼就是Student,Teacher父類是Person。繼承了父類那麼子類可以直接适用父類的方法或屬性(家産)。

實作關系(Realization):

類實作(implements)了接口.當多個類有類似的行為方式的時候我們通常會适用接口。

分析設計之類圖

Ship,Car都有move的特征他們都屬于交通工具(Vehicle)隻是他們move的方式不一樣。那麼我們就可以适用接口實作的方式去設計。代碼中是public class Car implements Vehicle

好我們來看一下一個完整的類圖例子:

分析設計之類圖

回顧一下之前關系。去分析一下此UML的類圖。

使用者通過注冊界面(RegisterForm)輸入個人資訊,
使用者點選“注冊”按鈕後将輸入的資訊通過一個封裝使用者輸入資料的對象(UserDTO)傳遞給操作資料庫的資料通路類(DAO),
為了提高系統的擴充性,針對不同的資料庫可能需要提供不同的資料通路類,是以提供了資料通路類接口,
如IUserDAO,每一個具體資料通路類都是某一個資料通路類接口的實作類,
如OracleUserDAO就是一個專門用于通路Oracle資料庫的資料通路類。      

UserDTO隻是把userAcount,userPassword封裝了一下使用了Getter,Setter。

那麼肯定是RegisterForm的成員,注冊窗體不能沒有使用者名與密碼資訊是以是組合關系。RegisterForm沒有了使用者資訊(UserDTO)那麼就沒有意義了。

然後IUserDAO與RegisterForm是聚合關系因為是可以替換的。比如說你可以使用Oracle的以後擴充成Mysql的那麼可以友善替換。

考慮到今後會擴充UserDAO是以适用了接口。

IUserDAO為什麼與UserDTO是依賴關系,因為IUserDAO要把使用者資訊儲存到資料庫中那麼必須需要使用者資訊。如果沒有了使用者資訊此工作無法完成是以是依賴關系