设计模式中类的关系简介

来源:互联网 发布:linux内核书籍推荐 编辑:程序博客网 时间:2024/04/27 23:15


   在java以及其他的面向对象设计模式中,类与类之间主要有4中关系,他们分别是:依赖,关联,聚合,组合继承,实现,他们的耦合度依次增强。

 1. 依赖(Dependence) -------------->  用虚线+>  表示

依赖关系的定义为:对应两个相独立的对象,当一个对象负责构造另外一个对象的实例,或者依赖另外一个对象服务时,这两个对象之间主要体现为dependence关系,如

类A中使用了类B,其中类B是作为类A的方法参数,方法中的局部变量,或者静态方法调用。类上面图中,People类依赖与Book类和Food类,Book类和Food类是作为类中方法的参数形式出现在People类中的。

代码实例

package com.xiu.desginer.test

public class People{

// Book 作为read方法的参数

public  void read(Book book ){

  System.out.println(book.getName());

}

// Food  作为read方法的参数

public void eat(Food food){

  System.out.println(food.getName());

}

}


2. 关联(Association)      实线+> 表示  

 关联分为单向关联和双向关联

单向关联

 

双向关联:

    对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联和双向关联。 单向关联表现为:类A当中使用了类B ,其中类B作为类A的成员变量。

双向关联表现 为:类A当中使用了类B作为成员变量,同时类B中也使用了类A作为成员变量。

代码:

package com.xiu.desginer.test

public class Son{

// 关联关系中作为成员变量的类一般会再类中赋值

Father father = new Father();

public String getFatherName(){

return father.getName();

}

}

package com.xiu.desginer.test

public class Father{

Son son = new Son();

public String getSonName(){

return son.getName();

}

}


3. 聚合(Aggregation)   四边形+> 表示


  聚合关系时关联关系的一种,耦合度强于关联关系,他们的代码表现是相同的, 仅仅是在语意上有区别,

关联关系间的对象是相互独立的。而聚合关系的对象之间存在包容关系。他们之间是整体--个体相互关系。

代码:

package com.xiu.desginer.test

public class People{
Car car;

House house;

// 聚合关系中作为成员变量的类一般使用set方法赋值

public void setCar(Car car){

this.car = car;

}

public void setHouse(House house){

this.house = house;

}

public void going(

System.out.println(car.getType());

)

public String  getAddress(){

return house.getAddress();

}

}


4.组合(Composition)  

  相比于聚合,组合是一种耦合度更强的关联关系,存在组合关系的类表示“整体--部分”关联关系,“整体”负责部分的生命周期,他们之间是共生死得关系,并且部分单独存在是没有任何意义,在下图的例子中,People与Soul、Body之间是组合关系,当人的生命周期开始时,必须同时有灵魂和肉体;当人的生命周期结束时,灵魂肉体随之消亡;无论是灵魂还是肉体,都不能单独存在,他们必须作为人的组成部分存在。


  1. Public class People{  
  2.     Soul soul;  
  3.     Body body;   
  4.     //组合关系中的成员变量一般会在构造方法中赋值  
  5.      Public People(Soul soul, Body body){   
  6.         This.soul = soul;  
  7.         This.body = body;  
  8.     }  
  9.   
  10.     Public void study(){  
  11.         System.out.println(“学习要用灵魂”+soul.getName());  
  12.     }  
  13.     Public void eat(){  
  14.         System.out.println(“吃饭用身体:”+body.getName());  
  15.     }  
  16. }


5.继承(Generalization)

        继承表示类与类(或者接口与接口)之间的父子关系。在java中,用关键字extends表示继承关系。UML图例中,继承关系用实线+空心箭头表示,箭头指向父类。

6.实现(Implementation)

         表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作。在java中使用implements表示。UML图例中,实现关系用虚线+空心箭头表示,箭头指向接口。


回顾


  • 依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
  • 关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。
  •  聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
  •  组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样