类图use-a,has-a,contain-a(composition),implements,extends区别
一、横向关系:
1.depedency依赖,use-a是类之间的一种很弱的联系,use-a,send-a,parameter-a关系,常用是将一个类对象作为一个类里面方法的参数。是偶然的,临时的,对象间是并列关系调用了一个对象,以利用它的成员。
2.association关联,use-a他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、;是固定的、长期的、对象间是并列的、可单向或双向的,1被关联类对象以类属性的形式出现在关联类中,2也可能是关联 类A引用了一个类型为被关联类B的全局变量。一般不是依赖、聚合和组合的非整体与局部(特别是对类的全局变量引用)就说关联关系。
属于关联下的聚合和组合关系(整体与局部关系):
3.aggregation聚合,has-a异步,学校与学院,用到了类a,因为要用类a的成员。弱的整体与局部关系,因为有a对象,但是a对象也可以被其他类拥有。他们之间不是生死与共的生命周期,然后是局部对象作为整体类的属性,局部的对象是可以在外面先创建的,可以被多个整体类调用,毁灭时不一定毁灭它。A relationship B用实线空菱形箭头表示。整体类属性,创建时间,其它类调用,毁灭时间。
4.composition组合,contain-a同步,窗口与菜单按钮,包含a,强的整体与局部的关系,拥有了a,且有且仅有它拥有a对象,是生死与共的生命周期,将局部的对象作为整体类的属性,创建时创建,只有被当前类使用,特别是毁灭时毁灭。A relationship B用实线实心菱形表示。整体类属性,创建时间,其它类调用,毁灭时间。
在C++语言中,从实现的角度讲,聚合可以表示为:
class A {...}
class B { A* a; .....}? //* a只是引用指针,也就是A对象的创建不在这里。
即类B包含类A的指针;
而组合可表示为:
class A{...}
class B{ A a; ...}
即类B包含类A的对象。
其关系强弱为dependency<association<aggregation<composition
二、纵向关系:
5.implements,实现接口 虚线实体大箭头表示.
6.extends IS-a就是继承关系了,当添加了新的方法就是is-like-a,应该首先考虑组合而不是继承,因为组合可以毫不影响引用类,且可以动态的修改新类的成员(来自java编程思想)。泛化: 继承实现方法多态的形式,实线大箭头表示。