組合關系和聚合關系有一個最大的不同,組合關系中的整體直接掌握部件的生滅,聚合關系中的整體並不具有生滅部件的權力。一旦組合中的整體不存在時,其組合部件也不能單獨存在,必須同時消滅。另外,外界也不能直接與部件溝通,必須通過整體代為傳達消息。那么在C++中實現組合關系時,不能由第三者產生部件后才將部件指標傳給整體,而是應該由整體直接負責部件的生滅。
有了定期定額申購之后,每個月的約定日到達就會自動產生一筆定額交易,也就是單期交易。那么定期定額申購與單期交易非常適合使用組合關系,一旦某筆定期定額申購被刪除,底下的單期交易也就不該再繼續存留。
下面我們來看一個“組合關系”的例子
Fund.h
1 class Fund 2 { 3 public: 4 Fund(float); 5 float getPrice(); 6 private: 7 float price; 8 };
Fund.cpp
1 #include "Fund.h" 2 3 Fund::Fund(float thePrice) 4 { 5 price=thePrice; 6 } 7 8 float Fund::getPrice() 9 { 10 return price; 11 }
RegularBid.h
1 #include <cstdlib> 2 #include <vector> 3 #include "BidItem.h" 4 using namespace std; 5 6 class RegularBid 7 { 8 public: 9 void createBidItem(float,Fund*); 10 int calcAsset(); 11 private: 12 vector<BidItem*> itemObj; 13 };
RegularBid.cpp
1 #include "RegularBid.h" 2 3 void RegularBid::createBidItem(float theUnit,Fund *theFund) 4 { 5 BidItem *myItem=new BidItem(theUnit); 6 myItem->setFund(theFund); 7 itemObj.push_back(myItem); 8 } 9 10 int RegularBid::calcAsset() 11 { 12 int size,theAsset=0; 13 size=itemObj.size(); 14 for(int i=0;i<size;i++) 15 theAsset=theAsset+itemObj[i]->calcAsset(); 16 return theAsset; 17 }
BidItem.h
1 #include "Fund.h" 2 3 class BidItem 4 { 5 public: 6 BidItem(float); 7 void setFund(Fund*); 8 int calcAsset(); 9 float getUnit(); 10 private: 11 float unit; 12 Fund *fundObj; 13 };
BidItem.cpp
1 #include "BidItem.h" 2 3 BidItem::BidItem(float theUnit) 4 { 5 unit=theUnit; 6 } 7 8 void BidItem::setFund(Fund *theFund) 9 { 10 fundObj=theFund; 11 } 12 13 int BidItem::calcAsset() 14 { 15 return unit*fundObj->getPrice(); 16 } 17 18 float BidItem::getUnit() 19 { 20 return unit; 21 }
main.cpp
1 #include <cstdlib> 2 #include <iostream> 3 #include "RegularBid.h" 4 #include "Fund.h" 5 using namespace std; 6 7 int main(int argc, char *argv[]) 8 { 9 Fund *myFund=new Fund(37.83); 10 RegularBid myRegularBid; 11 12 myRegularBid.createBidItem(590.53,myFund); 13 myRegularBid.createBidItem(890.85,myFund); 14 myRegularBid.createBidItem(901.45,myFund); 15 16 cout << "總資產為: " 17 << myRegularBid.calcAsset() << endl << endl; 18 19 system("PAUSE"); 20 return EXIT_SUCCESS; 21 }
下面我們來畫一下UML圖,並且用UML自動生成C++代碼來做一個比較
生成代碼對比
Fund.h
達到預期
RegularBid.h
達到預期
BidItem.h
達到預期
畫組合關系的時候,也是一樣,一旦類圖里面包含了一次成員那么在組合端點再聲明一次的話就會重復,另外如果不在類圖里面包含一次成員而在組合端點處聲明一次的話生成的代碼比較傻,很多情況下無法滿足我們的要求。所以我們就是把成員都在類圖里面包含進去,組合端點處就是聲明一下多重性,而不要再聲明成員就可以了。