依赖、关联、聚合、组合

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
公司和员工的关联关系 1
public class Company{ 2
private Employee employee; 3
public Employee getEmployee(){ 4
return employee; 5
} 6
public void setEmployee(Employee employee){ 7
代码表现: 1
public class Person{
2
/** 划船 */ 3
public void oarage (Boat boat){ 4
boat.oarage(); 5 } 6 } 7
关联:有名的客户和订单的关系以及公司和员工的关系,都是关联关 系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表 现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类 以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了 一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向 的。 从网上找到的公司和员工的UML图和代码 :
组合的UML图:
然而,聚合与组合的代码表现形式是一样的,都可以表现为以下的形 式,它们仅仅具有语义上的区别。
网上找到的电脑和CPU的关系的代码表现: 1
public class Computer{ 2源自文库
private CPU cpu; 3
public CPU getCPU(){ 4
return cpu; 5
} 6
public void setCPU(CPU cpu){ 7
this.cpu=cpu; 8
} 9
//开启电脑 10
public void start(){ 11
//cpu运作 12
cpu.run();
13
} 14 } 15
结语:
一般情况下,当某个类被当作参数传递并且被当作结果返回的时 候,或者被当作某个方法内的临时变量使用的时候,可以运用依赖关 系,使用关联来表示一个拥有关系,而不是整体-部分关系。使用聚合 来表示一个动态的整体-部分关系,而是用组合来表示一个静态的整体部分关系。但是需要指出的是,所谓“关系”只是在某个问题域才有效, 离开了这个问题域,可能这些关系就不成立了,例如之前我和小船的关 系,可能在某个问题域中,我是船夫,我的工作就是驾着小船在河上摆 渡,那我和小船的关系就上升为关联关系了。试想一下,武侠小说中的 那些剑仙们,修炼到人剑合一的境地,剑在人在,剑亡人亡,那它们之 间的关系就似乎与组合关系类似了。又如在关心汽车的领域里,轮胎是 一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖 轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以 用聚合了。这说明关系是在特定的问题域中的“关系”,会随着问题域的 迁移而改变的。最后顺便问一句:老公和老婆的关系是依赖还是关联 呢?一笑……
2、 聚合与组合同出而异体 聚合与组合其实都是关联的特例,都是整体和部分的关系。他们的 区别在于聚合的两个对象之间是可分离的,他们具有各自的生命周期。 而组合往往表现为一种唇齿相依的关系。 聚合:一种容纳或曰包含的关系,如同机场和飞机,汽车和轮胎的关 系。其实仔细想想,前面的公司和员工的关系也有聚合的味道在里面。 组合:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结 束时也就是部分的生命周期到头时。很有名的就是桌子和桌子腿的关 系。 聚合的UML图:
你是我的玫瑰-类关系阐微 世界是普遍联系的,因此程序世界中的类,也不可能是孤立的。 UML为我们定义了它们之间的关系,就是:依赖、关联、聚合、组合还 有泛化。 泛化关系比较好理解,就是表示类之间的继承关系。容易混淆的 是依赖、关联、聚合和组合的关系。这里做一些甄别: 1、 依赖和关联的颠倒颠 在网上查找了一下依赖和关联的区别,有说“关联本身即是一种依 赖”,亦有说“依赖是一种弱关联”,其实说来说去是一档子事。依赖和 关联都是说一个类用到了另一个类。其区别在于一个是使用,一个是拥 有。 依赖:具有某种偶然性。比如说我要过河,没有桥怎么办,我就去 借来一条小船渡过去。我与小船的关系仅仅是使用(借用)的关系。表 现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。或者是 class A 的某个方法创造了 class B 的实例抑或对class B的静态方法 的调用。如果A依赖于B,那意味着B的变化可能要求A也发生变化; 这是uml图表示的依赖关系:
this.employee=employee; 8
} 9
//公司运作 10
public void run(){ 11
employee.startWorking(); 12
} 13
} 14
可见依赖于与关联亦有动静之别,关联的类“静态”地引用了被关联类的 实例变量,而依赖的偶然性也正说明了它的动态性。
相关文档
最新文档