類(Class)封裝了數據和行爲,是面向對象的重要組成部分,是具備相同屬性、操做、關係的對象集合的總稱。在系統中,每一個類都具備必定的職責,職責指的是類要完成什麼樣的功能,要承擔什麼樣的義務。一個類能夠有多種職責,設計得好的類通常只有一種職責。在定義類的時候,將類的職責分解成爲類的屬性和操做(即方法)。類的屬性即類的數據職責,類的操做即類的行爲職責。設計類是面向對象設計中最重要的組成部分,也是最複雜和最耗時的部分。
在軟件系統運行時,類將被實例化成對象(Object),對象對應於某個具體的事物,是類的實例(Instance)。
類圖(Class Diagram)使用出如今系統中的不一樣類來描述系統的靜態結構,用來描述不一樣的類以及它們之間的關係。
在系統分析與設計階段,類一般能夠分爲三種,分別是實體類(Entity Class)、控制類(Control Class)和邊界類(Boundary Class)。
實體類:實體類對應系統需求中的每一個實體,它們一般須要保存在永久存儲體中,通常使用數據庫表或文件來記錄,實體類既包括存儲和傳遞數據的類,還包括操做數據的類。實體類來源於需求說明中的名詞,如學生、商品等。
控制類:控制類用於體現應用程序的執行邏輯,提供相應的業務操做,將控制類抽象出來能夠下降界面和數據庫之間的耦合度。控制類通常是由動賓結構的短語(動詞+名詞)轉化來的名詞,如增長商品對應有一個商品增長類,註冊對應有一個用戶註冊類等。
邊界類:邊界類用於對外部用戶與系統之間的交互對象進行抽象,主要包括界面類,如對話框、窗口、菜單等。
在面向對象分析和設計的初級階段,一般首先識別出實體類,繪製初始類圖,此時的類圖也可稱爲領域模型,包括實體類及其它們之間的相互關係。數據庫
在UML中,類使用包含類名、屬性和操做且帶有分隔線的長方形來表示。
類圖分爲三層,第一層是類的名稱,若是是抽象類或接口,就用斜體表示,其中接口名稱的上部會用<<interface>>修飾;第二層是類的成員變量,一般是字段和屬性;第三層是類的成員方法。類的成員變量和成員方法的修飾符分爲+、#、-,分別表示public、protected、private。
在UML類圖中,類通常由三部分組成:
(1) 第一部分是類名:每一個類都必須有一個名字,類名是一個字符串。
(2) 第二部分是類的屬性(Attributes):屬性是指類的性質,即類的成員變量。一個類能夠有任意多個屬性,也能夠沒有屬性
UML規定屬性的表示方式爲:
可見性 名稱:類型 [ = 缺省值 ]
其中:
「可見性」表示該屬性對於類外的元素而言是否可見,包括公有(public)、私有(private)和受保護(protected)三種,在類圖中分別用符號+、-和#表示。
「名稱」表示屬性名,用一個字符串表示。
「類型」表示屬性的數據類型,能夠是基本數據類型,也能夠是用戶自定義類型。
「缺省值」是一個可選項,即屬性的初始值。
(3) 第三部分是類的操做(Operations):操做是類的任意一個實例對象均可以使用的行爲,是類的成員方法。
UML規定操做的表示方式爲:
可見性 名稱(參數列表) [ : 返回類型]
其中:
「可見性」的定義與屬性的可見性定義相同。
「名稱」即方法名,用一個字符串表示。
「參數列表」表示方法的參數,其語法與屬性的定義類似,參數個數是任意的,多個參數之間用逗號「,」隔開。
「返回類型」是一個可選項,表示方法的返回值類型,依賴於具體的編程語言,能夠是基本數據類型,也能夠是用戶自定義類型,還能夠是空類型(void),若是是構造方法,則無返回類型。編程
類之間的關係種類:Realization(實現), Generalization(泛化),Dependency(依賴)、Association(關聯)、Aggregation(聚合)、Composition(組合)。 其中,Aggregation(聚合)、Composition(合成)屬於Association(關聯),是特殊的Association關聯關係。設計模式
依賴關係(Dependency) 是一種使用關係,特定事物的改變有可能會影響到使用該事物的其餘事物,在須要表示一個事物使用另外一個事物時使用依賴關係。大多數狀況下,依賴關係體如今某個類的方法使用另外一個類的對象做爲參數。
關係:依賴用來表示二者之間的依從關係,表現爲use a。編程語言
在UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。
ide
class channle { public: play(){cout<<"play";} } class TV { public: onplay(channel &chan) { chan.play(); } }
依賴關係有以下三種狀況:
(1)類B以參數的形式傳入類A的方法。
(2)類B以局部變量的形式存在於類A的方法中。
(3)類A調用類B的靜態方法。
依賴關係體現爲類構造方法及類方法的傳入參數,箭頭的指向爲調用關係;依賴關係除了臨時知道對方外,仍是「使用」對方的方法和屬性;函數
實現指的是一個類實現接口(能夠是多個)的功能;實現是類與接口之間最多見的關係;C中沒有直接的接口而是經過在類中定義純虛函數來實現的。
實現用來表示類與接口、抽象類與接口之間的關係,實現關係表現爲繼承抽象類。
UML圖中實現使用一條帶有空心三角箭頭的虛線指向接口。
設計
class animal { public: Roar() =0; } class Cat:public animal { public: Roar(){cout<<」cat」;} } class dog:public animal { public: Roar(){cout<<」cat」;} }
泛化關係表現爲繼承或實現關係(is a)。具體形式爲類與類之間的繼承關係,接口與接口之間的繼承關係,類對接口的實現關係。
泛化是一種繼承關係,用來表示類與類、類與抽象類、抽象類與抽象類、接口與接口之間的關係,泛化關係表現爲繼承非抽象類。
UML圖中實現使用一條帶有空心三角箭頭的實線指向基類。
3d
class shape { public: Display(){cout<<」shape」;} } class rectangle: public shape { public: Display(){cout<<」 rectangle」;} } class circle: public shape { public: Display(){cout<<」 circle」;} }
關聯(Association)關係是類與類之間最經常使用的一種關係,是一種結構化關係,用於表示一類對象與另外一類對象之間有聯繫,如汽車和輪胎、師傅和徒弟、班級和學生等等。
關聯表現爲變量(has a )。
關聯能夠是雙向的,也能夠是單向的;關聯關係能夠進一步劃分爲聚合及組合關係。
關聯關係有雙向關聯和單向關聯。
雙向關聯:兩個類都知道另外一個類的公共屬性和操做。
單向關聯:只有一個類知道另一個類的公共屬性和操做。
大多數關聯應該是單向的,單向關係更容易創建和維護,有助於尋找可服用的類。
UML圖中實現使用一條實線鏈接相同或不一樣類
code
聚合是關聯關係的一種,是強的關聯關係。聚合關係是總體和個體的關係。普通關聯關係的兩個類處於同一層次上,而聚合關係的兩個類處於不一樣的層次,一個是總體,一個是部分。同時,是一種弱的「擁有」關係。此時總體與部分之間是可分離的,他們能夠具備各自的生命週期, 部分能夠屬於多個總體對象,也能夠爲多個總體對象共享;好比計算機與CPU、公司與員工的關係等;表如今代碼層面,和關聯關係是一致的,只能從語義級別來區分。
聚合用來表示總體與部分的關係,是一種弱的關聯關係,體現爲A能夠包含B,但B不必定是A的一部分。
UML圖中實現使用一條帶有虛心菱形的線來表示
聚合是關聯關係的一種特例,體現的是總體與部分、擁有的關係,即has-a的關係,此時總體與部分之間是可分離的,他們能夠具備各自的生命週期,部分能夠屬於多個總體對象,也能夠爲多個總體對象共享在UML中,聚合關係用帶空心菱形的直線表示。例如:汽車發動機(Engine)是汽車(Car)的組成部分,可是汽車發動機能夠獨立存在,所以,汽車和發動機是聚合關係,
在代碼實現聚合關係時,成員對象一般做爲構造方法、Setter方法或業務方法的參數注入到總體對象中。對象
組合是關聯關係的一種,是比聚合關係強的關聯關係。它要求普通的聚合關係中表明總體的對象負責表明部分的對象的生命週期。Composition(組合關係)是一種強的「擁有」關係,體現了嚴格的部分和總體的關係,部分和總體的生命週期一致。他一樣體現總體與部分間的關係,但此時總體與部分是不可分的,總體的生命週期結束也就意味着部分的生命週期結束;好比你和你的大腦,window窗口和frame,在窗口中建立一個frame時必須把它附加到窗口上,當窗口消失時frame也就消失了;表如今代碼層面,和關聯關係是一致的,只能從語義級別來區分;
關係:組合用來表示總體與部分的關係,是一種強的關聯關係,體現了嚴格的總體和部分的關係,總體和部分的生命週期同樣。
UML圖中實現使用一條帶有實心菱形的線來表示
組合也是關聯關係的一種特例,體現的是一種contains-a的關係,這種關係比聚合更強,也稱爲強聚合;他一樣體現總體與部分間的關係,但此時總體與部分是不可分的,總體的生命週期結束也就意味着部分的生命週期結束。在UML中,組合關係用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,並且若是頭沒了,嘴巴也就沒了,所以頭和嘴巴是組合關係。
聚合關係是「has-a」關係,組合關係是「contains-a」關係;聚合關係表示總體與部分的關係比較弱,而組合比較強;聚合關係中表明部分事物的對象與表明聚合事物的對象的生存期無關,一旦刪除了聚合對象不必定就刪除了表明部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了表明部分事物的對象。在聚合關係中,部分能夠獨立於聚合而存在,部分的全部權也能夠由幾個聚合來共享,好比打印機就能夠在辦公室內被廣大同事共用
聚合和組合的區別則在語義和實現上都有差異,組合的兩個對象之間其生命期有很大的關聯,被組合的對象是在組合對象建立的同時或者建立以後建立,在組合對象銷燬以前銷燬。通常來講被組合對象不能脫離組合對象獨立存在,並且也只能屬於一個組合對象,例如一個文檔的版本,必須依賴於文檔的存在,也只能屬於一個文檔。聚合則不同,被聚合的對象能夠屬於多個聚合對象,例如一個員工可能能夠屬於多個公司
組合關係也是聚合關係的一種,是比聚合關係更強的關係。組合關係是不能共享的。例如人有四肢、頭等。
組合表示類之間總體和部分的關係,組合中部分和總體具備統一的生存週期。一旦總體對象不存在,部分對象也將不存在。部分對象和總體對象之間具備共生死的感受。
a、聚合和組合都是一種結合關係,只是額外具備總體部分的含義
b、部件的生命週期不一樣
聚合關係中,總體不會擁有部件的生命週期,因此總體刪除時,部件不會被刪除。再者,多個總體能夠共享同一個部件
組合關係中,總體擁有部分的生命週期,因此總體刪除時,部件必定會跟着刪除。並且,多個總體不能夠同時間共享一個部件。
c、聚合關係是「has-a」關係,組合關係是「contain-a」關係
關聯關係所涉及的兩個對象是處在同一個層次上的。好比人和自行車就是一種關聯關係,而不是聚合關係,由於人不是自行車的組成部分。
聚合關係涉及的兩個對象處於不平等的層次上,一個表明總體,一個表明部分。好比:電腦和它的顯示器、鍵盤、主板和內存就是彙集關係。
耦合度:泛化=實現>組合>聚合>關聯>依賴
車的類圖結構爲<<abstract>>,表示車是一個抽象類;它有兩個繼承類:小汽車和自行車;它們之間的關係爲實現關係,使用帶空心箭頭的虛線表示。小汽車爲與SUV之間是繼承關係,它們之間的關係爲泛化關係,使用帶空心箭頭的實線表示。小汽車與發動機之間是組合關係,使用帶實心箭頭的實線表示。學生與班級之間是聚合關係,使用帶空心箭頭的實線表示。學生與×××之間爲關聯關係,使用一根實線表示。學生上學須要用到自行車,與自行車是一種依賴關係,使用帶箭頭的虛線表示。