类关系(UML&设计模式)
2014-06-30 10:25
344 查看
类之间存在的6种关系:
依赖 关联 聚合 组合 实现(接口) 继承(泛化)
其中,聚合和组合是关联的两种具体关系,关联包含组合和聚合。
关系强弱:依赖是关系最弱的,关联是强依赖,聚合是强关联,组合是强聚合。
注意:继承比起接口,可以扩展,接口最好不要扩展。
各种关系图与代码:
1.依赖:
代码:
描述:
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
2.关联:
代码:
描述:
体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系 也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中, 也可能是关联类A引用了一个类型为被关联类B的全局变量
3.聚合:
代码:
描述:
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可 以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
4.组合:
代码:
描述:
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体 与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
5.实现(接口):
代码:
描述:
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
6.继承:
代码:
描述:
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
总结
在Java中,应该尽量优先使用组合,而不是继承,因为继承会使得类关系过于复杂化,破坏了封装性,使用组合一样可以获得已有类的功能,而且会使新类更加稳固。
实际上,从依赖 -----〉聚合--------〉组合,类与类之间的关系更加紧密,互相之间的影响越来越大,其实我们平常比较少去区分这些关系,而且事实上这东西的定义不太好理解,所以肯定会导致认识上的偏差,所以我们使用这些东西的时候,尽量靠近大家都认同的做法,这样容易让别人理解。
依赖 关联 聚合 组合 实现(接口) 继承(泛化)
其中,聚合和组合是关联的两种具体关系,关联包含组合和聚合。
关系强弱:依赖是关系最弱的,关联是强依赖,聚合是强关联,组合是强聚合。
注意:继承比起接口,可以扩展,接口最好不要扩展。
各种关系图与代码:
1.依赖:
代码:
Public class A {//注意这没有定义类B在类A中的私有变量 public B operation(B b){//返回值和方法参数 b.opb();//方法参数位置 B bb = new B();//局部变量 bb.opbb(); B.staticop();//静态方法调用 } } |
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;
2.关联:
代码:
Public class A{ Private B b; } |
体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系 也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中, 也可能是关联类A引用了一个类型为被关联类B的全局变量
3.聚合:
代码:
Public class A{ Private B b; public set(B b){ This.b=b; } } |
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可 以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
4.组合:
代码:
Public class A{ Private B b = new B(); //第一种方法; Public A(){ b=new B(); } //第二种方法; Public A(B b){ This.b=b; } //第三种方法; } |
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体 与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
5.实现(接口):
代码:
Public class A{ public void op1(); public void od2(); } public class B implements A{ public void op1(){必须实现;} public void op2(){必须实现;} public void op3(){可以扩展但不提倡;} } |
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
6.继承:
代码:
Public class A{ public void op1(); public void od2(); } public class B implements A{ public void op1(){必须实现;} public void op2(){必须实现;} public void op3(){可以扩展,提倡扩展;} ... } |
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;
总结
在Java中,应该尽量优先使用组合,而不是继承,因为继承会使得类关系过于复杂化,破坏了封装性,使用组合一样可以获得已有类的功能,而且会使新类更加稳固。
实际上,从依赖 -----〉聚合--------〉组合,类与类之间的关系更加紧密,互相之间的影响越来越大,其实我们平常比较少去区分这些关系,而且事实上这东西的定义不太好理解,所以肯定会导致认识上的偏差,所以我们使用这些东西的时候,尽量靠近大家都认同的做法,这样容易让别人理解。
相关文章推荐
- 类关系(UML&设计模式)
- 【设计模式】UML关系图示例
- 设计模式------------UML关系
- 设计模式中类的关系UML
- 软件工程 ,UML ,设计模式 简单关系
- 设计模式中类的关系UML
- 设计模式&UML学习
- 设计模式学习---UML常见关系的实现
- 【设计模式系列】之《UML五种关系与代码的对应关系》
- 设计模式--UML关系与代码对照
- 设计模式中类的关系(转载自"卡奴达摩的专栏")
- OOAD&UML_OOAD概述_UML_OO设计原则_OO设计模式_分析阶段静态建模_分析阶段动态建模_设计阶段静态建模_设计阶段动态建模
- 学习设计模式第三 - 基础使用UML表示关系
- 设计模式奠基石——UML关系转化为代码
- 设计模式——UML建模的重要知识类图关系和基本的设计原则小结
- 设计模式——UML建模的重要知识类图关系和基本的设计原则小结
- (二)设计模式之UML六大关系
- 设计模式之UML(一)类图以及类间关系(泛化 、实现、依赖、关联、聚合、组合)
- 设计模式基础:类及类关系的UML表示
- 设计模式奠基石——UML关系转化为代码