组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力。一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭。另外,外界也不能直接与部件沟通,必须通过整体代为传达消息。那么在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
达到预期
画组合关系的时候,也是一样,一旦类图里面包含了一次成员那么在组合端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在组合端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,组合端点处就是声明一下多重性,而不要再声明成员就可以了。