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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UML类图详解_关联关系_多对一相关的知识,希望对你有一定的参考价值。

首先先来明确一个概念,即多重性。什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(0),最大数目为没有设限(*),如果仅标示一个数目级上下限相同。

技术分享

实际在UML中是可以隐藏上图中申购交易的细节

技术分享

导航性(navigation):关联关系的细节信息通常放置于两关联端,像是关联端标示箭头,代表该关联端具有可导航性。

技术分享

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

Fund.h

 1 class Fund
 2 { 
 3 public:
 4     void setPrice(float);
 5     float getPrice();
 6     void setFee(float);
 7     float getFee();
 8 private:
 9     float price;
10     float fee;
11 };

Fund.cpp

 1 #include "Fund.h"
 2 
 3 void Fund::setPrice(float thePrice)
 4 {
 5     price=thePrice;
 6 }
 7 
 8 float Fund::getPrice()
 9 {
10     return price;
11 }
12 
13 void Fund::setFee(float theFee)
14 {
15     fee=theFee;
16 }
17 
18 float Fund::getFee()
19 {
20     return fee;
21 }

Bid.h

 1 #include "Fund.h"
 2  
 3 class Bid 
 4 {
 5 public:
 6     float calcUnit();
 7     float calcFee();   
 8     void setFund(Fund*);
 9     void setAmount(int);
10     int getAmount();
11 private:
12     int amount;
13     Fund *fundObj; 
14 };

声明一个基金对象指针,此即为多重性为1的实现方法之一。然后类Bid中的函数setFund设计了一个公有操作,让外界可以传入基金对象的指针,也就建立起申购交易对象指向基金对象的链接了。

Bid.cpp

 1 #include "Bid.h"
 2 
 3 float Bid::calcUnit()
 4 {
 5       float thePrice, theUnit;
 6       thePrice=fundObj->getPrice();
 7       theUnit=amount/thePrice;
 8       return theUnit;
 9 } 
10 
11 float Bid::calcFee()
12 {
13       float theFundFee, theFee;
14       theFundFee=fundObj->getFee();
15       theFee=amount*theFundFee;
16       return theFee;
17 }
18 
19 void Bid::setFund(Fund *theFund)
20 {
21     fundObj=theFund;
22 }
23 
24 void Bid::setAmount(int theAmount)
25 {
26     amount=theAmount;
27 }
28 
29 int Bid::getAmount()
30 {
31     return amount;
32 }

main.cpp

 1 #include <cstdlib>
 2 #include <iostream>
 3 #include "Fund.h"
 4 #include "Bid.h"
 5 using namespace std;
 6 
 7 int main(int argc, char *argv[])
 8 {
 9     Fund myFund;
10     float thePrice, theFee;
11     Bid myBid; 
12     int theAmount;
13     
14     cout << "请输入大华大华基金净值: ";
15     cin >> thePrice;
16     myFund.setPrice(thePrice);
17     cout << "请输入大华大华基金手续费: ";
18     cin >> theFee;
19     myFund.setFee(theFee);
20      
21     cout << "请输入申购金额: ";
22     cin >> theAmount;
23     myBid.setAmount(theAmount);
24     myBid.setFund(&myFund);
25 
26     cout << "您申购的单位及手续费为: " 
27          << "(" << myBid.calcUnit() << ")"
28          << "(" << myBid.calcFee() << ")" << endl << endl;
29 
30     system("PAUSE");
31     return EXIT_SUCCESS;
32 }

通过调用myBid.setFund(&myFund)将基金对象的指针传给申购交易对象,于是就建立起申购交易对象指向基金对象的链接。

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

画法一:

技术分享

生成代码对比

Bid.h

技术分享

达到预期

Fund.h

技术分享

达到预期

 

画法二:

技术分享

生成代码对比

Bid.h

技术分享

没有达到预期,重复生成了成员变量

Fund.h

技术分享

达到预期

 

画法三:

技术分享

生成代码对比

Bid.h

技术分享

达到预期

Fund.h

技术分享

达到预期

综上所述,在实际画图的时候采用画法一或者画法三都可以,个人还是觉得画法一好一些

 

以上是关于UML类图详解_关联关系_多对一的主要内容,如果未能解决你的问题,请参考以下文章

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

UML类图详解_聚合关系

UML类图关系(泛化(继承)实现依赖关联聚合组合)

UML类图详解_组合关系

UML类图与类的关系详解

UML类图与类的关系详解