面向对象设计指南 基础篇

 
看到网络上很多人在问如何在代码中实现设计模式中类与类的关系如:Association, Aggregation and Composition。在这篇文章中我会用代码来实现他们的关系。
在实现之前,我还是想把它们的概念阐述清楚,从而让你对代码的实现有更好的理解。
1为什么要有Association?
设计模式就是一系列的类以及关系的组合,我们通过使用设计模式来解决实际问题,从而做到软件的复用。类在系统中是不能单独存在的,它需要与其他的类共同作用,传递消息从而解决问题。Association就是用来描述类和类之间的关系。但是这个类之间的关系比较Weak,打个比方:你是一个类(Human)的实例,你有如下的行为或者说方法:Eat, Smell, Drink, etc.突然你想喝水了,于是你拿起杯子。在这期间你的实例调用了Drink的方法,在这个方法中你实例化了一个叫做Cup的实例。那么当你喝完水后也就是Drink的方法返回后,Cup的实例就不被你也就是Human的实例所需要了。
在这个例子中Cup和Human两个类的关系就叫做Association。Association强调一种相互使用的关系,虽然使用但是相互之间不会含有有任何的Responsibility。
2 Aggregation VS Association
当两个类的关系更加紧密的时候Association就会被另一种关系Aggregation所取代。当2个类互为Aggregation关系的时候他们是不对等的。Aggregation强调一个类从属于或者说是另一个类的一部分。再比如说,还是你类(Human)的实例,你特别喜欢你女朋友送给你的Star Bucks的杯子。不论你上班下班还是上厕所买东西你都要随身带着它,这是时候你和这个Cup的实例的关系就更加紧密。从Association升级到Aggregation。你不知道这个杯子是在哪里或者说被谁制造出来的(Instancing),你只是把它带在身边,使用它。这时候Cup的实例和你就是一对Aggregation关系。但是你并不对Cup的生命周期所负责(这就不用我举例子了吧,应为Human类的析构比较可怕,呵呵)
3 Composition – 比Aggregation 更加紧密。
某些情况下Aggregation还是不能表示两个类之间的关系,Composition就被引入了。Composition强调一个类需要管理另一个类的生命周期。我相信有了以上的描述大家再理解Composition就不在是问题。大家有听说过,马季先生的相声五官争功吧(再次怀念一下马季先生),对于马季来说,冯巩,赵岩,刘伟,etc.的生命周期都需要他来管理。在这里Composition 关系就有了很好的体现。
下面是Coding time:
假设有两个类A和B
Class A
{
Public:
Void Hello();
}
Class B
{
Public:
B(A *pA)
{
     m_pA = pA;
}
Private:
A *m_pA;
}
Association的实现就应该是这样的:
Void A::Hello()
{
     B b;
}
Aggregation的实现就应该是这样的:
A a;
B *pB = new B(&a);
Composition的实现就应该是这样的:
Class B
{
Private:
A a;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值