`
mmdev
  • 浏览: 12947871 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

深入解析类与类之间的关系

 
阅读更多

在学习过Java面向对象之后,老师几乎都会提到类与类之间的关系;类之间的关系有五种:继承、依赖、关联、聚合、组合.在UML绘制图的过程中我们也要使用这五种关系图,下面将个人前段时间上课所记录笔记供大家学习,希望有所收获。

*1、关联 Association 关联指的是类之间的引用关系。这是实体域对象之间最普遍使用最广泛的一种关系。关联可分为一对一、一对多和多对多关联

案例:
Customer(客户)对象与Orders(订单)对象之间就存在着一对多的关联关系,一个Customer(客户)可以有多个Orders(订单),而一个Orders(订单)只能属于一个Customer(客户)。显然客户与订单之间存在着一对多的关系,反之订单与客户之间存在着多对一的关系。
那么对于java中的类到底怎么实现一对多与多对一得关联呢?
答:如果类Customer与Orders关联,那么第一种方式:在Customers(客户)类中定义集合Orders(订单)类的对象作为Customer(客户) 类的一个属性.这样就解决了Customer类与Orders类之间的一对多的关系了.具体的代码如下:
package redarmy_chen.edu;

import java.util.HashSet;
import java.util.Set;

public class Customer {
/** 客户的ID */
private int id;
/** 客户的名称 */
private String name;
/** 客户的邮箱 */
private String email;

/** 所有与客户Customer对象关联的Order对象 */
private Set<Orders> allOrders = new HashSet<Orders>();

/**默认的构造器*/
public Customer() {

}
/**完整的构造器*/
public Customer(int id, String name, String email, Set<Orders> allOrders) {
this.id = id;
this.name = name;
this.email = email;
this.allOrders = allOrders;
}

/**下面是对应私有属性的set get方法 */
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Set<Orders> getAllOrders() {
return allOrders;
}

public void setAllOrders(Set<Orders> allOrders) {
this.allOrders = allOrders;
}

}
以上就构成了Customer类到Orders类的一对多关联。关联的EA图如图1.1所示

图1.1
同样也可以建立从Orders类到Customer类的关联,一个Orders类的对象只能对应一个Customer的对象,因此在Orders类中定义一个Customer对象,来存放该订单属于哪个客户。这样就可实现java类中的多对一的关系了.具体代码如下:
package redarmy_chen.edu;

public class Orders {
/** Orders订单对象的序号ID */
private int id;
/** Orders订单对象的编号 */
private String orderNumber;
/** Orders订单对象的价格 */
private double price;
/** 与Orders对象关联的Customer对象 */
private Customer customer;

public Orders() {

}

public Orders(int id, String orderNumber, double price, Customer customer) {
this.id = id;
this.orderNumber = orderNumber;
this.price = price;
this.customer = customer;
}

/** 下面是对应私有属性的set get方法 */
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getOrderNumber() {
return orderNumber;
}

public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public Customer getCustomer() {
return customer;
}

public void setCustomer(Customer customer) {
this.customer = customer;
}

}
以上就构成了Orders类到Customer类的多对一的关联。关联的EA图如1.2图所示:

图1.2
同过以上的讲解我们又可以把关联分为单向关联和双向关联
a、单向关联:仅仅建立从Customer到Orders的一对多的关联,即仅仅在Customer类中定义allOrders集合,或者仅仅建立从Orders到Customer的多对一的关联,即仅仅在Orders类中定义customer属性(参考以上两个图的结果)。
b、双向关联:即建立从Customer到Orders的一对多的关联,又建立从Orders到Customer的多对一的关联。如图1.3所示:

图1.3
*2、依赖 Dependency 依赖指的是类之间的访问关系。如果类A访问类B的属性或方法,或者类A负责实例化类B, 那么可以说类A依赖类B
和关联关系不同,无需把类B定义为类A的属性
案例1:在原有的Customer类的基础之上,我们再创建一个CustomerOper的类,此类完成向数据库表中插入一条Customer(客户)记录.代码如下:
package redarmy_chen.edu;

public class CustomerOper {
/**在此方法中我们使用到Customer类对象并使用此对象的属性或者方法*/
public boolean insert(Customer customer){
/**在此方法中省略了插入数据库实现的方法,如果学员有兴趣可以自己实现*/
return false;
}
}
以上就构成了CustomerOper类到Customer类的依赖关系。依赖的EA图如1.4图所示:

图1.4
案例2:在原有的Customer类的基础,创建CreateCustomer类,此类负责创建一个Customer类的实例.代码如下:
package redarmy_chen.edu;

publicclass CreateCustomer {
/**在此负责创建一个Customer的实例并返回*/
public Customer loadCustomer(){
/**具体实现方法省略 */
return null;
}

}
以上就构成了CustomerCreate类到Customer类的依赖关系。依赖的EA图如1.5图所示:

此外,软件应用中上层的类总是依赖下层的类或接口.比如在业务逻辑层的类依赖持久化层的类或接口。
总结:谁使用了谁,谁负责创建谁=è谁就依赖谁。

*3、聚合 Aggregation 聚集是关联关系的一种特例聚集指的是整体与部分之间的关系 他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;例如:人与手就是聚集关系.由于聚集关系比较简单,通过图1.6所示:


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

*5、一般化 Generalization 一般化值得是类之间的继承关系在学习面向对象的时候老师都会重点讲解:下面给出EA图的绘制方法如图1.8所示

以上内容归本人原创,版权归本人所有不得随意转载,如有问题请发送邮件到redarmy_chen@qq.com

分享到:
评论

相关推荐

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块之间的关系。第一部分详细分析了Spring的核心:IoC...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) 决战大数据时代!IT技术人员不得不读! 计文柯 著

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》是国内一本系统分析Spring源代码的著作,也是Spring领域的问鼎之作,由业界拥有10余年开发经验的专业Java专家亲自执笔,Java开发者社区和Spring开发者...

    Spring技术内幕:深入解析 Spring架构与设计原理.pdf

    本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块之间的关系;第一部分详细分析了Spring的核心:IoC容器和AOP的实现,能帮助读者了解Spring的运行机制;第二...

    cegui 深入解析教程

    该文章深入解析了CEGUI的每个模块的功能及相互之间的联系,对于了解CEGUI底层有很大帮助

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块之间的关系。第一部分详细分析了Spring的核心:IoC...

    深入解析DB2--高级管理,内部体系结构与诊断案例.part3

    本书从DB2内核组件入手,同时介绍了其与操作系统在进程、共享内存、信号量之间的关系。作者在本书中重点介绍了各个内部组件的层次与功能、内存体系结构、存储内部结构、高级锁等。优化器是任何数据库执行SQL的关键...

    深入解析DB2:高级管理、内部体系结构与诊断案例 002

    本书从DB2内核组件入手,同时介绍了其与操作系统在进程、共享内存、信号量之间的关系。作者在本书中重点介绍了各个内部组件的层次与功能、内存体系结构、存储内部结构、高级锁等。优化器是任何数据库执行SQL的关键...

    Spring技术内幕:深入解析 Spring架构与设计原理

    Spring技术内幕:深入解析 Spring架构与设计原理,本书是国内唯一一本系统分析Spring源代码的著作,也是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔,Java开发者社区和Spring开发者社区...

    深入解析Spring架构与设计原理

    本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块之间的关系;第一部分详细分析了Spring的核心:IoC容器和AOP的实现,能帮助读者了解Spring的运行机制;第二...

    SPRING技术内幕:深入解析SPRING架构与设计原理

    本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块之间的关系;第一部分详细分析了Spring的核心:IoC容器和AOP的实现,能帮助读者了解Spring的运行机制;第二...

    深入解析unsigned int 和 int

    我们主要来看一下signed和unsigned与int之间的联系与区别。什么叫做有符号,什么叫做无符号这个问题其实很简单,比如:5和-5,5没有符号,-5有符号。简单吧。但是在计算机中的这种符号可不简单。我们分别来看一下:在...

    Spring框架:深入解析、心得分享与实战应用

    在Spring框架中,开发者可以通过配置文件或注解的方式,定义和管理应用程序中的对象及其依赖关系。这使得对象之间的耦合度降低,提高了代码的可维护性和可扩展性。同时,Spring还提供了强大的事务管理、数据访问、...

    深入剖析文档和视图之间的联系与区别

    主要功能:该电子文档是积累了多年我在Windows编程的经验总结,深入地解析了文档与视图之间是如何进行关联的,对于深入理解MFC编程原理有极大地帮助,值得学习。

    牛新庄: 深入解析DB2:高级管理、内部体系结构与诊断案例

    本书从DB2内核组件入手,同时介绍了其与操作系统在进程、共享内存、信号量之间的关系。作者在本书中重点介绍了各个内部组件的层次与功能、内存体系结构、存储内部结构、高级锁等。优化器是任何数据库执行SQL的关键...

    深入理解Android:卷2

    第8章深入讲解了Surface系统的实现原理,分析了Surface与Activity之间以及Surface与SurfaceFlinger之间的关系、SurfaceFlinger的工作原理、Surface系统中的帧数据传输以及LayerBuffer的工作流程。第9章对Vold和Rild...

    深入理解Android卷1

    第8章深入讲解了Surface系统的实现原理,分析了Surface与Activity之间以及Surface与SurfaceFlinger之间的关系、SurfaceFlinger的工作原理、Surface系统中的帧数据传输以及LayerBuffer的工作流程。第9章对Vold和Rild...

    《深入理解Android:卷I》试读本

    第8章深入讲解了Surface系统的实现原理,分析了Surface与Activity之间以及Surface与SurfaceFlinger之间的关系、SurfaceFlinger的工作原理、Surface系统中的帧数据传输以及LayerBuffer的工作流程。第9章对Vold和Rild...

Global site tag (gtag.js) - Google Analytics