类间的耦合关系

归类:

1.继承(extends),也称泛化(generalization)

2.实现(implements)

3.组合(composition)

4.聚合(aggregation)

5.关联(association)

6.依赖(dependency)

说明:

继承:

子类继承父类,子类与父类之间形成的耦合关系称之为继承关系(泛化关系)。

耦合方向:父类到子类

实现:

一个类实现了一个接口,这个类与接口之间形成的耦合关系就是实现关系。

耦合方向:接口到实现类

组合:

是一种关联关系的特例,语义上体现为contains-a关系,组合关系比聚合更强,也成为强聚合。它同样体现整体和部分的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。代码层面和关联关系一致,只能从语义级别区分。

耦合方向:部分到整体

聚合:

也是一种关联关系的特例,语义上体现为has-a关系。它也体现了整体与部分的关系,但是此时整体与部分之间是可分离的,部分可以属于多个整体对象,他们具有各自的生命周期。

耦合方向:部分到整体

关联:

是一种强的耦合关系,这种关系比依赖关系的耦合更强。在代码层面体现为:一个类(部分)以成员变量的角色在另一个类(整体)中存在。

耦合方向:部分到整体

依赖:

一种弱的耦合关系。代码层面体现为:一个类(提供者)以局部变量,方法的参数,以及对静态方法的调用的角色在另一个类(调用者)中存在。

耦合方向:提供者到调用者

谈谈耦合方向:

所谓耦合方向也是依赖方向。如果A类与B类存在耦合关系,当A类发生变化(可能是增加新的方法,修改了已有的方法的方法描述,删除方法等等)导致B类需要做出调整。则认为耦合方向是从A类到B类。耦合方面描述了变化方向。

在代码层面区分组合与聚合(个人观点):

首先,组合与聚合都是是一种关联关系,体现的都是一种整体与部分的关系,即都会以成员变量的角色表现。而两者的生命周期的区别如何在代码层面体现呢?以java为例,要实现此目的,就必须在整体对象的外部保持局部对象的引用。所以在整体对象的外部是否存在局部对象的引用,应该可以作为组合与耦合在代码层面的区别了。

我认为可以有以下三种形式:

1.构造函数的参数

即部分对象作为构造函数的参数传递给整体对象。因为在整体对象构造之前全局对象就已经存在了(生命周期不一样)。

2.public访问符修饰

全局对象创建之后,可以直接改变局部对象,甚至重新给全局对象赋值一个新的局部对象。

3.get/set方法

全局对象提供了局部成员对象的get或set方法

常见的变化种类:

增加方法,删除方法,改变方法描述符(删除方法+新增方法),增加成员变量,删除成员变量

强弱比较

实现>继承>组合>聚合>关联>依赖

各种关系强弱的比较标准: 被依赖的类的发生各种变化之后,依赖它的类(有耦合关系)也需要变化的可能性大小。

为什么实现比继承更强?因为实现中实现类必须与接口完全一致,当接口发生任何变化的时候,实现类都会变化。而继承关系中子类是为扩展父类,父类即使添加新功能(增加新方法),子类也无需变化。所以在使用接口时,一旦确定了接口就很少改变该接口,最好是新增一个接口类,实现类同时实现多个接口。

研究耦合关系的意义

面向对象编程活动,从耦合关系的角度来看,就是使用以上六种耦合关系来描述实际问题。而程序的优劣也可以根据其中存在的耦合关系是否合适来判断。

面向对象的基本原则,设计模式,六种耦合关系三者之间也存在重要的联系。设计原则的地位是最高的,设计模式是实现原则的手段,而六种耦合关系支撑设计模式的基本要素。设计模式的内容总体上包括:类(包括接口)的划分,类(包括接口)之间的关系。其中类之间的关系就是类之间的耦合关系。

参考:

http://www.cnblogs.com/yyyyy5101/archive/2011/03/11/1981078.html

http://www.360doc.com/content/13/0304/13/10504424_269223190.shtml

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>