`

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

阅读更多

在学习过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

 

3
0
分享到:
评论
1 楼 Far_ranqing 2011-05-06  
!

相关推荐

    深入理解Android:卷I--详细书签版

    与surfaceflinger之间的关系、surfaceflinger的工作原理、surface系统中的帧数据传输以及layerbuffer的工作流程。第9章对vold和rild的原理和机制进行了深入的分析,同时还探讨了 phone设计优化的问题;第10章分析了...

    asp.net知识库

    C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用...

    MATLAB教学视频数模资料及源程序代码下载及说明-MATLAB教学视频,数模资料及源程序代码下载及说明.pdf

    MATLAB教学视频数模资料及源程序代码下载及说明-MATLAB教学视频,数模资料及源程序代码下载及说明.pdf ...并深入探讨了离散时间系统的初始状态与初始条件之间的关系。 MATLAB原创教学视频,持续更新中……

    Google Android SDK开发范例大全(第3版) 1/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    Google Android SDK开发范例大全(第3版) 4/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    Google Android SDK开发范例大全(第3版) 3/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    Google Android SDK开发范例大全(第3版) 5/5

    完整的手机数据存取功能:铃声模式设置、震动控制、WiFi服务、屏幕旋转、电池计量、温度测量、电信网络信息、SIM卡信息、拨打电话、短信解析、通讯录联系人、电子罗盘、屏幕手写等手机控制功能。 系统服务及研发的...

    自己动手写操作系统(含源代码).part2

    第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...

    自己动手写操作系统(含源代码).part1

    第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二...

Global site tag (gtag.js) - Google Analytics