UML類圖是一種結(jié)構(gòu)圖,,用于描述一個(gè)系統(tǒng)的靜態(tài)結(jié)構(gòu)。類圖以反映類結(jié)構(gòu)和類之間關(guān)系為目的,,用以描述軟件系統(tǒng)的結(jié)構(gòu),,是一種靜態(tài)建模方法,。類圖中的類,,與面向?qū)ο笳Z言中的類的概念是對(duì)應(yīng)的。 1 類結(jié)構(gòu)在類的UML圖中,,使用長方形描述一個(gè)類的主要構(gòu)成,,長方形垂直地分為三層,以此放置類的名稱,、屬性和方法,。 其中, 一般類的類名用正常字體粗體表示,,如上圖,;抽象類名用斜體字粗體,如 屬性和方法都需要標(biāo)注可見性符號(hào), 另外,,還可以用冒號(hào) 2 類關(guān)系類與類之間的關(guān)系主要有六種:繼承、實(shí)現(xiàn),、組合,、聚合、關(guān)聯(lián)和依賴,,這六種關(guān)系的箭頭表示如下,, 接著我們來了解類關(guān)系的具體內(nèi)容。 3 六種類關(guān)系六種類關(guān)系中,,組合,、聚合、關(guān)聯(lián)這三種類關(guān)系的代碼結(jié)構(gòu)一樣,,都是用屬性來保存另一個(gè)類的引用,,所以要通過內(nèi)容間的關(guān)系來區(qū)別。 3.1 繼承繼承關(guān)系也稱泛化關(guān)系(Generalization),,用于描述父類與子類之間的關(guān)系,。父類又稱作基類,子類又稱作派生類,。 繼承關(guān)系中,,子類繼承父類的所有功能,父類所具有的屬性,、方法,,子類應(yīng)該都有。子類中除了與父類一致的信息以外,,還包括額外的信息,。 例如:公交車、出租車和小轎車都是汽車,,他們都有名稱,,并且都能在路上行駛。 PHP代碼實(shí)現(xiàn)如下: name = '公交車'; } } class Taxi extends Car { public function __construct() { $this->name = '出租車'; } } // 客戶端代碼 $line2 = new Bus; echo $line2->name . $line2->run(); 3.2 實(shí)現(xiàn)實(shí)現(xiàn)關(guān)系(Implementation),,主要用來規(guī)定接口和實(shí)現(xiàn)類的關(guān)系,。 接口(包括抽象類)是方法的集合,在實(shí)現(xiàn)關(guān)系中,,類實(shí)現(xiàn)了接口,,類中的方法實(shí)現(xiàn)了接口聲明的所有方法。 例如:汽車和輪船都是交通工具,,而交通工具只是一個(gè)可移動(dòng)工具的抽象概念,,船和車實(shí)現(xiàn)了具體移動(dòng)的功能。 name . '在路上行駛'; } } class Ship implements Vehicle { public $name = '輪船'; public function run() { return $this->name . '在海上航行'; } } // 客戶端代碼 $car = new Car; echo $car->run(); 3.3 組合關(guān)系組合關(guān)系(Composition):整體與部分的關(guān)系,,但是整體與部分不可以分開,。 組合關(guān)系表示類之間整體與部分的關(guān)系,,整體和部分有一致的生存期。一旦整體對(duì)象不存在,,部分對(duì)象也將不存在,,是同生共死的關(guān)系。 例如:人由頭部和身體組成,,兩者不可分割,,共同存在。
head = $head; } public function setBody(Body $body) { $this->body = $body; } public function display() { return sprintf('人由%s和%s組成', $this->head->name, $this->body->name); } } // 客戶端代碼 $man = new Human(); $man->setHead(new Head()); $man->setBody(new Body()); echo $man->display(); 3.4 聚合關(guān)系聚合關(guān)系(Aggregation):整體和部分的關(guān)系,,整體與部分可以分開,。 聚合關(guān)系也表示類之間整體與部分的關(guān)系,成員對(duì)象是整體對(duì)象的一部分,,但是成員對(duì)象可以脫離整體對(duì)象獨(dú)立存在,。 例如:公交車司機(jī)和工衣、工帽是整體與部分的關(guān)系,,但是可以分開,,工衣、工帽可以穿在別的司機(jī)身上,,公交司機(jī)也可以穿別的工衣,、工帽。 clothes = $clothes; } public function wearHat(Hat $hat) { $this->hat = $hat; } public function show() { return sprintf('公交車司機(jī)穿著%s和%s', $this->clothes->name, $this->hat->name); } } // 客戶端代碼 $driver = new Driver(); $driver->wearClothes(new Clothes()); $driver->wearHat(new Hat()); echo $driver->show(); 3.5 關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系(Association):表示一個(gè)類的屬性保存了對(duì)另一個(gè)類的一個(gè)實(shí)例(或多個(gè)實(shí)例)的引用,。 關(guān)聯(lián)關(guān)系是類與類之間最常用的一種關(guān)系,,表示一類對(duì)象與另一類對(duì)象之間有聯(lián)系。組合,、聚合也屬于關(guān)聯(lián)關(guān)系,只是關(guān)聯(lián)關(guān)系的類間關(guān)系比其他兩種要弱,。 關(guān)聯(lián)關(guān)系有四種:雙向關(guān)聯(lián),、單向關(guān)聯(lián)、自關(guān)聯(lián),、多重?cái)?shù)關(guān)聯(lián),。 例如:汽車和司機(jī),一輛汽車對(duì)應(yīng)特定的司機(jī),,一個(gè)司機(jī)也可以開多輛車,。 在UML圖中,雙向的關(guān)聯(lián)可以有兩個(gè)箭頭或者沒有箭頭,,單向的關(guān)聯(lián)或自關(guān)聯(lián)有一個(gè)箭頭,。上圖對(duì)應(yīng)的PHP代碼如下: cars[] = $car; } } class Car { public $drivers = array(); public function addDriver(Driver $driver) { $this->drivers[] = $driver; } } // 客戶端代碼 $jack = new Driver(); $line1 = new Car(); $jack->addCar($line1); $line1->addDriver($jack); print_r($jack); 在多重性關(guān)系中,可以直接在關(guān)聯(lián)直線上增加一個(gè)數(shù)字,,表示與之對(duì)應(yīng)的另一個(gè)類的對(duì)象的個(gè)數(shù),。
3.6 依賴關(guān)系依賴關(guān)系(Dependence):假設(shè)A類的變化引起了B類的變化,則說名B類依賴于A類,。 大多數(shù)情況下,,依賴關(guān)系體現(xiàn)在某個(gè)類的方法使用另一個(gè)類的對(duì)象作為參數(shù)。 依賴關(guān)系是一種“使用”關(guān)系,,特定事物的改變有可能會(huì)影響到使用該事物的其他事物,,在需要表示一個(gè)事物使用另一個(gè)事物時(shí)使用依賴關(guān)系。 例如:汽車依賴汽油,,如果沒有汽油,,汽車將無法行駛。
type; } } class Car { public function beforeRun(Oil $oil) { return '添加' . $oil->add(); } } // 客戶端代碼 $car = new Car; echo $car->beforeRun(new Oil()); 4 總結(jié)這六種類關(guān)系中,,組合,、聚合和關(guān)聯(lián)的代碼結(jié)構(gòu)一樣,可以從關(guān)系的強(qiáng)弱來理解,,各類關(guān)系從強(qiáng)到弱依次是:繼承→實(shí)現(xiàn)→組合→聚合→關(guān)聯(lián)→依賴,。如下是完整的一張UML關(guān)系圖。 (點(diǎn)擊圖片查看大圖) UML類圖是面向?qū)ο笤O(shè)計(jì)的輔助工具,,但并非是必須工具,,如果暫時(shí)不理解本文的內(nèi)容,可以繼續(xù)看設(shè)計(jì)模式部分,,并不會(huì)影響,。
參考資料: |
|