此篇文章是我讀《UML for C++ programmer》的讀書心得,透過書裡的範例,重新整理而成的一篇文章。
本文目錄
- 類別圖
系統內部的靜態結構
- 循序圖
實作,物件外部的互動行為
- 案例圖
系統的外部行為
- 狀態圖
物件內部變化
類別圖
結合關係
只要在類別內宣告,不管是直接宣告或指標(java骨子裡都是指標,沒有直接宣告這回事,所以在C++當作是同一回事。)
一對一結合關係
class Bid
{
Fund *fundObj;
};
將Fund類別的物件,當作是Bid類別的
Member Variable使用。
|
類別圖 |
|
物件圖 |
一對多結合關係
class Account
{
vector<Bid*> bidObj;
};
將Bid類別的物件,當作是Account類別的Member Variable使用。
陣列也一樣
|
類別圖 |
|
物件圖 |
多對一結合關係
class Account
{
vector <Bid*> bidObj;
};
將Bid類別的物件,當作是Account類別的Member Variable使用。
陣列也一樣
class Bid
{
Fund *fundObj;
};
將Bid類別的物件,當作是Account類別的Member Variable使用。
|
類別圖 |
|
物件圖 |
組合關係
其實,還有一個聚合關係,不管是組合關係還是聚合關係,差別在於這兩個類別之間,有著「整體-部份」的關係
(在Design Pattern裡,就是組件的那個Pattern?)
聚合關係 - 不會create「部份」類別
組合關係 - 會create「部份」類別
class RegularBid
{
public:
void createBidItem( float, Fund* );
private:
vector<biditem> itemObj;
};
void RegularBid::createBitItem(float theUnit, Fund* theFund)
{
BidItem *myItem = new BidItem(theUnit);
}
BidItem和RegularBid之間有著
整體 – 部份的關係
將BidItem類別的物件,當作是RegularBid類別的Member Variable使用。
利用Member Function來掌握其生命週期。
|
類別圖 |
|
物件圖 |
依賴關係
此類別內不宣告該物件,而該物件為參數。
class Bid
{
int calcAsset(Fund*);
};
將Fund類別的物件,當作Bid類別中
Member Funcion的Parameter使用。
|
類別圖 |
|
物件圖 |
一般化關係
這就是繼承,其中還有protceted的權限和虛擬函數。
class SingleBid : puclic Bid
{
};
SingleBid
繼承Bid。
|
類別圖 |
|
物件圖 |
protected權限的一般化關係
class Bid
{
protected:
Fund *fundObj;
int amount;
};
Bid裡的
funObj和amount設定成protected的權限,提供繼承類別(SingleBid)的存取權限,並且不屬於公開。。
class SingleBid : puclic Bid
{
};
SingleBid繼承了Bid。
|
類別圖 |
|
物件圖 |
有虛擬函數的一般化關係
class Bid
{
public:
virtual int calcAsset() = 0;
virtual float getUnit() = 0;
};
Bid裡的
calcAsset()和getUnit()設定為(純)虛擬,提供繼承類別(SingleBid)重新定義該Member function的實作。
class SingleBid : puclic Bid
{
public:
int calcAsset();
float getUnit();
};
SingleBid繼承了Bid,重新定義caclAsset()和getUnit()兩個Member function,因為虛擬所以可以透過Bid呼叫SingleBid的Memberfunction實作內容。
|
類別圖 |
|
物件圖 |
循序圖
循序圖與類別圖的耦合
結合關係
class Bid
{
Fund *fundObj;
};
float Bid::calcUnit()
{
thePrice = funObj->getPirce();
}
float Bid::calcFee()
{
theFundFee = fundObj->getFee();
}
結合關係
class Account
{
vector<Bid*> bidObj;
};
int Account::calcAmount()
{
for( int i = 0; i < size; i++)
theAmount += bidObj[i]->getAmount();
}
結合關係
class Account
{
vector<Bid*> bidObj;
};
int Account::calcAsset()
{
for( int i = 0; i < size; i++)
theAsset += bidObj[i]->getAsset();
}
class Bid
{
Fund *fundObj;
};
int Bid::calcAsset()
{
return unit * funObj->getPrice();
}
組合關係
class RegularBid
{
public:
void createBidItem( float, Fund* );
private:
vector itemObj;
};
void RegularBid::createBitItem(float theUnit, Fund* theFund)
{
BidItem *myItem = new BidItem(theUnit);
myItem->setFund(theFund);
itemObj.push_back(myItem);
}
依賴關係
class Bid
{
int calcAsset(Fund*);
};
int Bid::calcAsset(Fund* theFund)
{
return unit * theFund->getPrice();
}
一般化關係
class SingleBid : puclic Bid
{
};
循序圖和.cpp的實作
private操作
class RegularBid
{
public:
int calcAsset(Fund*);
private:
float getUnit();
};
int Bid::calcAsset(Fund* theFund)
{
return getUnit() * theFund->getPrice();
}
protected操作
class Bid
{
public:
virtual int calcAsset(Fund*) = 0;
private:
float getUnit();
};
class RegularBid : public Bid
{
int calcAsset(Fund*);
};
int RegularBid::calcAsset(Fund* theFund)
{
return getUnit() * theFund->getPrice();
}
new操作
class Account
{
public:
Account();
};
int main()
{
Account* myAccount = new Account();
}
delete操作
class Account
{
public:
~Account();
};
int main()
{
delete myAccount;
}
通訊圖
可透過轉檔的方式,從循序圖轉成通訊圖
通訊圖 = 序號 + 循序圖
案例圖
參考《架站前一定要上的10堂課》裡的sitepath diagram
狀態圖
參考電機電子的FSM
沒有留言:
張貼留言
(什麼是留言欄訊息?)