类关系(UML&设计模式)

本文详细解析了类之间存在的六种关系:依赖、关联、聚合、组合、实现(接口)、继承(泛化)。从代码实现到实际应用场景,逐一阐述每种关系的特点及强弱对比。

类之间存在的6种关系:

 

依赖 关联 聚合 组合 实现(接口) 继承(泛化)

 

其中,聚合和组合是关联的两种具体关系,关联包含组合和聚合。

关系强弱:依赖是关系最弱的,关联是强依赖,聚合是强关联,组合是强聚合。

注意:继承比起接口,可以扩展,接口最好不要扩展。

 

各种关系图与代码:

 

1.依赖:

类关系(UML&设计模式)

 

 代码:

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.关联:

 类关系(UML&设计模式)

 代码:

 Public class A{

  Private B b;

}

 

描述:

体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系 也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中, 也可能是关联类A引用了一个类型为被关联类B的全局变量

 

 

3.聚合:

 类关系(UML&设计模式)

 

 代码:

 Public class A{

  Private B b;

   public set(B b){

   This.b=b;

   }

}

 

描述:

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可 以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

 

 

4.组合:

 类关系(UML&设计模式)

 代码:

 Public class A{

  Private B b = new B(); //第一种方法;

  Public A(){ b=new B(); } //第二种方法;

  Public A(B b){ This.b=b; } //第三种方法;

}

 

描述:

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体 与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

 

 

5.实现(接口):

 类关系(UML&设计模式)

 代码:

 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.继承:

 类关系(UML&设计模式)

 代码:

 

 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中,应该尽量优先使用组合,而不是继承,因为继承会使得类关系过于复杂化,破坏了封装性,使用组合一样可以获得已有类的功能,而且会使新类更加稳固。

实际上,从依赖 -----〉聚合--------〉组合,类与类之间的关系更加紧密,互相之间的影响越来越大,其实我们平常比较少去区分这些关系,而且事实上这东西的定义不太好理解,所以肯定会导致认识上的偏差,所以我们使用这些东西的时候,尽量靠近大家都认同的做法,这样容易让别人理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值