• UML类图详解_组合关系


    组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力。一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭。另外,外界也不能直接与部件沟通,必须通过整体代为传达消息。那么在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 

    达到预期

    画组合关系的时候,也是一样,一旦类图里面包含了一次成员那么在组合端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在组合端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,组合端点处就是声明一下多重性,而不要再声明成员就可以了。 

  • 相关阅读:
    不用+做加法
    实用类型转换
    Failed to retrieve application JMX service URL
    0.辗转相除法
    1. 数组与字符串
    Java数据结构之257二叉树的所有路径
    Java数据结构与算法之DFS
    Java数据结构与算法之图
    Java数据结构与算法之快速排序、归并排序
    Java数据结构与算法之冒泡排序、选择排序
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7750405.html
Copyright © 2020-2023  润新知