• UML类图详解_关联关系_多对多


    在关联关系中,很多情况下我们的多重性并不是多对一或者一对多的,而是多对多的。

    不过因为我们要考虑里面的导航性,如果直接搞的话就是需要去维护两群对象之间多对多的互指链接,这就十分繁杂且易错。那么我们怎么办呢?可以将多对多的多重性尝试拆解为两组一对多的设计。

    我们可以改为上图的这种拆解方法。就是说在账户与基金之间多搞一个申购交易,这样就可以化解多对多的复杂度。一个账户底下可以记录多笔申购交易,而每一个申购交易将指定某一档基金。虽然可以重复申购同一档基金,不过每一个申购交易只能设定一档基金。

    一个账户对象可以链接多个申购交易对象,而每个申购交易对象只能链接到一个基金对象。

    下面我们来看一个“多对多”的例子

    Account.h

     1 #include <cstdlib>
     2 #include <vector>
     3 #include "Bid.h" 
     4 using namespace std;
     5  
     6 class Account 
     7 {
     8 public:
     9     void setBid(Bid*); 
    10     int calcAsset(); 
    11 private:
    12     vector<Bid*> bidObj;
    13 };

    Account.cpp

     1 #include "Account.h"
     2             
     3 void Account::setBid(Bid *theBid)
     4 { 
     5      bidObj.push_back(theBid);
     6 }
     7 
     8 int Account::calcAsset()
     9 {
    10      int size,theAsset=0;
    11      size=bidObj.size();
    12      for(int i=0;i<size;i++)
    13          theAsset=theAsset+bidObj[i]->calcAsset();
    14      return theAsset; 
    15 } 

    Bid.h

     1 #include "Fund.h" 
     2  
     3 class Bid 
     4 {
     5 public:
     6     Bid(float); 
     7     void setFund(Fund*);
     8     int calcAsset(); 
     9     float getUnit();
    10 private:
    11     float unit;
    12     Fund *fundObj; 
    13 };

    Bid.cpp

     1 #include "Bid.h"
     2 
     3 Bid::Bid(float theUnit)
     4 { 
     5      unit=theUnit;
     6 }
     7 
     8 void Bid::setFund(Fund *theFund)
     9 {
    10      fundObj=theFund;
    11 }
    12 
    13 int Bid::calcAsset()
    14 {
    15     return unit*fundObj->getPrice();
    16 } 
    17  
    18 float Bid::getUnit()
    19 {
    20     return unit;
    21 }

    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 }

    main.cpp

     1 #include <cstdlib>
     2 #include <iostream>
     3 #include "Bid.h"
     4 #include "Account.h" 
     5 #include "Fund.h" 
     6 using namespace std; 
     7  
     8 int main(int argc, char *argv[])
     9 { 
    10     Fund *myFund; 
    11     Bid *myBid; 
    12     Account myAccount; 
    13     
    14     myFund=new Fund(19.84); 
    15     myBid=new Bid(100);
    16     myBid->setFund(myFund); 
    17     myAccount.setBid(myBid); 
    18     cout << "大华大华基金单位及净值: "
    19          << "(" << myBid->getUnit() << ")"
    20          << "(" << myFund->getPrice() << ")" << endl; 
    21          
    22     myFund=new Fund(37.83); 
    23     myBid=new Bid(200);
    24     myBid->setFund(myFund); 
    25     myAccount.setBid(myBid);
    26     cout << "日盛上选基金单位及净值: "
    27          << "(" << myBid->getUnit() << ")"
    28          << "(" << myFund->getPrice() << ")" << endl;
    29     
    30     myBid=new Bid(300);
    31     myBid->setFund(myFund); 
    32     myAccount.setBid(myBid);
    33     cout << "日盛上选基金单位及净值: "
    34          << "(" << myBid->getUnit() << ")"
    35          << "(" << myFund->getPrice() << ")" << endl << endl;
    36     
    37     cout << "总资产为: "
    38          << myAccount.calcAsset() << endl << endl;
    39            
    40     system("PAUSE");
    41     return EXIT_SUCCESS;
    42 }

    下面我们来画一下UML图,并且用UML自动生成C++代码来做一个比较

    生成代码对比

    Account.h

    达到预期

    Bid.h

    达到预期

    Fund.h

    达到预期

  • 相关阅读:
    打印一个0到1之间的数的二进制表示
    bzoj-3223 文艺平衡树
    Linux下使用fstatfs/statfs查询系统相关信息
    Pku3664
    hdu-2544 最短路
    java同步包种ArrayBlockingQueue类的分析与理解
    【剑指offer】不用加减乘除做加法
    PA模块经常使用表
    网络编程
    // 插入排序 源代码
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7749814.html
Copyright © 2020-2023  润新知