首先先来明确一个概念,即多重性。什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(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

达到预期

综上所述,在实际画图的时候采用画法一或者画法三都可以,个人还是觉得画法一好一些   (update 2017-10-29)其实应该是使用画法一,这样可以避免错误,具体错误的例子可以见UML类图详解_关联关系_一对多,一旦有了比较复杂的类型,那么生成的代码就不靠谱了。一旦类图里面包含了一次成员那么在关联端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在关联端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,关联端点处就是声明一下多重性,而不要再声明成员就可以了。

UML类图详解_关联关系_多对一的更多相关文章

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

    对于一对多的示例,可以想象一个账户可以多次申购.在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了. 下面我们来看一个“一对多” ...

  2. UML类图详解_泛化关系

    泛化其实就是继承关系,还是比较简单的,那么我们就把之前有些问题的博客UML类图重新来实现一次. 依旧是这个图 下面我们来看一个例子 Account.h #include <cstdlib> ...

  3. UML类图详解

    下面是类图的实例: (注:飞翔接口那里应为空心三角形) UML中类图实例 接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的关系):关联:实线+箭头(企鹅需要知道气候才迁移 ...

  4. UML 类图详解

    转载来源:http://blog.csdn.net/shift_wwx/article/details/79205187 可以参考:http://www.uml.org.cn/oobject/2012 ...

  5. UML类图详解和示例

    ps:博客园markdown不能自动生成列表,更好的阅读体验可访问我的个人博客http://www.isspark.com/archives/UMLDescription UML类图概述 什么是UML ...

  6. UML类图详解_组合关系

    组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...

  7. UML类图详解_关联关系_多对多

    在关联关系中,很多情况下我们的多重性并不是多对一或者一对多的,而是多对多的. 不过因为我们要考虑里面的导航性,如果直接搞的话就是需要去维护两群对象之间多对多的互指链接,这就十分繁杂且易错.那么我们怎么 ...

  8. UML类图详解_聚合关系

    结合UML关系,以看台和基金来介绍聚合关系 aggregation,是一种特殊的关联关系,既有关联关系的特质,还独有“整体 —— 部分(whole —— part)”的特质. 也就是说,用之前的关联关 ...

  9. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

随机推荐

  1. bzoj 2660: [Beijing wc2012]最多的方案

                       Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 617  Solved: 361[Submit][Status][ ...

  2. 【母函数】hdu2082 找单词

    普通型母函数详解见这里:http://www.wutianqi.com/?p=596 裸题,存个板子. #include<cstdio> #include<cstring> u ...

  3. ListView控件(下)简单适配器

    (一) 1.效果图 2.activiy_main.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  4. Maven设置snapshot无法在远程仓库下载的问题解决

    检查步骤如下: 1.检查nexus是否纳入public版本中: 2.配置中是否启用snapshots功能.以下方法两种设置都可以,任选一个即可. 一种是在项目pom.xml使用: <reposi ...

  5. Linux下Shell脚本替换换行符(转)

    说明:过滤换行符确实有点吭,不是那么好弄.处理文本时需要将换行符替换为空格,若使用sed命令会比较麻烦,而使用tr命令非常方便. 输入文本(country.txt) China America Fra ...

  6. css:滑动门

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 关于java的关键字 transient

    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable ...

  8. SQL注入之导出WebShell

    已经听N个人过说有人已经发现SQL注入Access得到webshell的技术了,也只是听说而已,具体的细节还是不得而知. 最近在看的书中一章提到Jet的安全,然后灵光一闪,呵呵,发现了一种可以利用ac ...

  9. saltstack之salt event事件用法

    event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签 ...

  10. JS 取得当前日期时间(文本形式)

    //-------------------------------------- // 取得当前时间,来自网上,作者不详 //------------------------------------- ...