设为首页 加入收藏

TOP

7.3 链接与关系
2013-10-07 00:12:18 来源: 作者: 【 】 浏览:53
Tags:7.3 链接 关系

7.3 链接与关系

在序列图中,一对象(发送对象)可以发送消息给另一对象(接收对象),意味着发送对象有一条链接(link)线指向接收对象。然而,这条链接不能随意产生,必须在对象所属的类之间定义了关联、聚合、组合或依赖,任一项关系时,才能够在执行期间,建立两个对象之间的链接,并且通过链接发送消息。

请看图7-10所示的示意图,在类图中,定期定额申购(RegularBid)类与基金(Fund)类之间有关联关系,所以在序列图的对象世界中,两个对象之间可以通过链接来发送消息。也就是说,类所产生的对象是序列图中矩形图标的对象;而关联关系所产的对象,其实是链接,只不过在序列图中,对象之间的链接线并未表达出来,它是个隐含的元素。

 
图7-10 链接与关系

不只是关联关系,两个类之间存在聚合、组合或动态的依赖,同样都可以在对象之间建立链接,以便发送消息,如图7-11所示。

图7-11 组合关系与链接

至于泛化关系,则不会在对象之间产生链接,因为它是类之间的关系,并非对象之间的关系。泛化关系不会出现于序列图中,因为序列图在表达执行期间,是对象的世界,不是编译(compile)期间的类世界。

最后,我们来看两个简单的案例,藉此看到序列图依赖类图的情况。虽然两个案例的结果相同,可是却会因为类图的设计不同,而导致出不同的序列图设计。

先看第一个案例,如图7-12所示的类图设计,申购交易(Bid)与基金(Fund)两个类之间有依赖。由于依赖非静态关系,它所建立的链接仅存活于计算资产(calcAsset)操作执行期间,一旦该操作执行结束后,申购交易对象将无法再使用此链接调用基金对象的操作。执行画面如图7-13所示。

 
图7-12 依赖

图7-13 执行画面

再看序列图7-14,我们特别为基金对象命名,这样可以清楚看到第5号消息中,将该基金对象(myFund)的指针传入,所以在申购交易对象执行计算资产(calcAsset)期间,便可以通过暂时的动态链接来调用基金对象。

下述程序清单7-10~7-14为C++(www.cppentry.com)的源代码,对应图7-14的序列图消息序号处,如下所述。

1. main.cpp中行号12—myFund=new Fund(19.84);

2. main.cpp中行号13—myBid=new Bid(1430);

3. main.cpp中行号15—myBid->getUnit();

4. main.cpp中行号16—myFund->getPrice();

5. main.cpp中行号17—myBid->calcAsset(myFund);

6. Bid.cpp中行号10—theFund->getPrice();

图7-14 序列图

程序清单7-10 Bid.h

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

程序清单7-11 Bid.cpp

//// EX07_02
1. // Bid.cpp
2. //
3. #include "Bid.h"
4. Bid::Bid(float theUnit)
5. {
6. unit=theUnit;
7. }
8. int Bid::calcAsset(Fund *theFund)
9. {
10. return unit*theFund->getPrice();
11. }
12. float Bid::getUnit()
13. {
14. return unit;
15. }
//// EX07_02

程序清单7-12 Fund.h

//// EX07_02
1. // Fund.h
2. //
3. #pragma once
4. class Fund
5. {
6. public:
7. Fund(float);
8. float getPrice();
9. private:
10. float price;
11. };
//// EX07_02

程序清单7-13 Fund.cpp

//// EX07_02
1. // Fund.cpp
2. //
3. #include "Fund.h"
4. Fund::Fund(float thePrice)
5. {
6. price=thePrice;
7. }
8. float Fund::getPrice()
9. {
10. return price;
11. }
//// EX07_02

程序清单7-14 main.cpp

//// EX07_02
1. // main.cpp
2. //
3. #include <cstdlib>
4. #include <iostream>
5. #include "Bid.h"
6. #include "Fund.h"
7. using namespace std;
8. int main(int argc, char *argv[])
9. {
10. Fund *myFund;
11. Bid *myBid;
12. myFund=new Fund(19.84);
13. myBid=new Bid(1430);
14. cout << "大华大华基金单位、净值及总资产为: "
15. << "(" << myBid->getUnit() << ")"
16. << "(" << myFund->getPrice() << ")"
17. << "(" << myBid->calcAsset(myFund) << ")"
18. << endl << endl;
19. system("PAUSE");
20. return EXIT_SUCCESS;
21. }
//// EX07_02

接着,再看第二个案例的类图7-15,两个类之间使用关联关系,并且通过申购交易(Bid)的设定基金(setFund)操作,来建立起两个对象之间固定的静态链接,且该链接可以跨操作而存活,不局限于单一操作之执行期间。

再看图7-16的执行画面,跟上一个案例的执行画面相同,以此看到虽然两个案例可以达到相同的结果,可是却因类图设计的差异,导致生成不同的序列图设计。

 
图7-16 执行画面

在序列图7-17的第6号消息处,并未传入基金对象的指针,但是仍然可以链接到基金对象取得净值,并且计算出资产。这是因为在此之前的3号消息中,已经设定好基金对象的链接了,而且这是个固定的静态链接,所以可以跨操作使用。

 
图7-17 序列图

下述程序清单7-15~7-19为C++(www.cppentry.com)的源代码,对应图7-17的序列图消息序号处,如下所述。

1. main.cpp中行号12—myFund=new Fund(19.84);

2. main.cpp中行号13—myBid=new Bid(1430);

3. main.cpp中行号14—myBid->setFund(myFund);

4. main.cpp中行号16—myBid->getUnit();

5. main.cpp中行号17—myFund->getPrice();

6. main.cpp中行号18—myBid->calcAsset(myFund);

7. Bid.cpp中行号14—fundObj->getPrice();

程序清单7-15 Bid.h

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

程序清单7-16 Bid.cpp

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

程序清单7-17 Fund.h

//// EX07_03
1. // Fund.h
2. //
3. #pragma once
4. class Fund
5. {
6. public:
7. Fund(float);
8. float getPrice();
9. private:
10. float price;
11. };
//// EX07_03

程序清单7-18 Fund.cpp

//// EX07_03
1. // Fund.cpp
2. //
3. #include "Fund.h"
4. Fund::Fund(float thePrice)
5. {
6. price=thePrice;
7. }
8. float Fund::getPrice()
9. {
10. return price;
11. }
//// EX07_03

程序清单7-19 main.cpp

//// EX07_03
1. // main.cpp
2. //
3. #include <cstdlib>
4. #include <iostream>
5. #include "Bid.h"
6. #include "Fund.h"
7. using namespace std;
8. int main(int argc, char *argv[])
9. {
10. Fund *myFund;
11. Bid *myBid;
12. myFund=new Fund(19.84);
13. myBid=new Bid(1430);
14. myBid->setFund(myFund);
15. cout << "大华大华基金单位、净值及总资产为: "
16. << "(" << myBid->getUnit() << ")"
17. << "(" << myFund->getPrice() << ")"
18. << "(" << myBid->calcAsset() << ")"
19. << endl << endl;
20. system("PAUSE");
21. return EXIT_SUCCESS;
22. }
//// EX07_03


回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇7.4 消息与操作 下一篇3.3.1 H264层次构成

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: