面向对象编程:对象之间的关系类型

介绍

对象之间的关系定义了这些对象如何交互或协作来执行应用程序中的操作。在应用程序中,用户界面类的对象都与业务层对象交互,以执行操作。在后台,业务层对象可能与职责库对象交互,而职责库的对象又与数据源对象或服务对象进行交互。

案例研究

在继续之前,让我们假定一个客户订单管理应用程序,该应用程序管理客户为某些产品下的订单。每个订单可以有一个或多个产品。第一步是从给定的描述中挑选出独立的类。使用单一责任原则可以派生以下类。

Customer -表示可以为任何产品下订单的客户

Address—表示客户的地址或订单的发货地址

Order——表示客户下的订单

OrderItem——表示客户为其放置订单的产品

Product-代表产品本身

CustomerRepository——这个类负责从数据源保存或读取客户信息。

OrderRepository—这个类负责从数据源保存或读取订单信息

ProductRepository——这个类负责读取或保存产品信息。

面向对象编程中的基本关系类型是,

协作

聚合

继承

让我们更详细地研究它们。

协作

协作关系有时被称为“使用”关系。当一个对象使用另一个不相关的对象来完成一个操作时,两个对象被称为协作。

在我们的应用程序中,为了保存和检索客户详细信息,CustomerRepository使用客户对象对数据源进行保存和读取。类似地,其他存储库类(如ProductRepository和OrderRepository)分别使用Product和Order对象,因此被称为协作执行操作。

public class CustomerRepository  
{  
 // Retrieves a single customer 
 public Customer Retrieve(int customerId)  
    {  
 // create an instance of the Customer Class 
        Customer customer = new Customer(customerId);  
 
 // code that retrieves the defined Customer 
 // populate the customer object and return 
 
 return customer;  
    }  
}

在CustomerRepository类中,您必须注意到,存储库CustomerRepository从数据源检索客户详细信息,保存客户信息。

聚合

组合关系有时被称为“Has a”的关系。在这种关系中,对象可以由一个或多个对象以其属性的形式组成。以下是一些可以从给定的应用程序描述中得出的事实:

每个客户都有一个地址,订购的产品将在该地址装运

每个订单都有一个客户、一个送货地址和一个以OrderItem表示的产品

从上面的事实可以很容易地得出,我们的Order类对象由Customer、Address和OrderItem对象组成。OrderItem对象进一步由Product类对象组成。Order类将这些对象组合为其属性,

如下面的代码所示,

public class Order  
{  
 
 public Customer Customer { get; set; }  
 public Address ShippingAddress { get; set; }  
 public List<OrderItem> OrderItems { get; set; }  
}  

组合

组合是一种特殊的聚合关系,在这种关系中,组件部分不存在,只是作为组成部分的一部分。

例如,在我们的应用程序中,Order类的对象由一个客户和一个OrderItem组成。如果我们打破订单和客户类之间的关系,客户类仍然可以退出。但是,如果Order类和OrderItem类之间的关系被破坏,那么OrderItem类就不存在。

假设我们的应用程序的功能将来会发生变化,现在它不再接受产品订单,而是为现有客户提供一些其他服务,比如消息传递服务。在这个场景中,Order类现在将不再有用。但是,曾经由Order类组成的Customer类在没有它的情况下仍然存在。相反,OrderItem类不能。

Order和OrderItem类之间共享的关系类型称为组合关系。

继承

继承本身就是一个需要讨论的大话题。在这里,我们不讨论不同类型的继承以及如何在代码中实现它。我们只讨论继承作为一种关系。

继承有时被称为“is”关系。在这种关系中,一个类继承另一个类的成员。继承的类被称为基类,而继承类被称为派生类。由于派生类具有基类的成员,因此可以认为派生类是基类的子类型。派生类可能有也可能没有继承类之外的成员。

假设我们的应用在市场上运行得很好。鉴于此,产品所有者现在希望在应用程序中添加一个新特性,以监视具有高需求的产品类型。从新的需求中,很明显,我们必须创建产品类的子类型。这些子类型将表示现实世界中的特定产品类别,

如下图所示。

如上图所示,类MusicAlbum和Book有它们自己的一些属性。因为它们从Product类继承,所以它们也继承了它的属性。可以说,音乐是一种产品,书也是。

我希望这能帮助您对对象关系有一个基本的了解。欢迎您对本文提出任何反馈、问题或评论。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

第1章 JVM语言家族概览

所谓编程语言只是一个抽象的规范,而编译器是这个规范的实现,它是在这个规范的严格定义下被实现的.

22630
来自专栏Android机动车

Java 基础(一)——重新理解面向对象

如何利用对象完成真正有用的工作呢?必须有一种办法能向对象发出请求,令其做一些实际的事情。接口就是对一个对象的行为进行规范,使对象具有做某些事情的能力。

8310
来自专栏程序人生

重构:撰写合格的代码

在「代码重构之道」里,我犯了个懒,讨论了什么情况下需要考虑重构,以及工具和方法来促进重构,但对如何重构代码本身,或者说:如何把烂代码转化成好代码,或者至少是合格...

37980
来自专栏养码场

若你想入职面试阿里系公司,不妨看看这位资深Java的面试经

上上周分享了占小狼面试阿里系的面经文章:《一位资深Java的阿里系公司实战面试经验,套路还是面试官的多》 ,蛮受大家欢迎的。看到大家在社群里的好评与点赞,占小狼...

25120
来自专栏大宽宽的碎碎念

程序里怎么表达“没有”

最近忙着调研gRPC做服务治理,尝试用protobuf3重写现有的接口逻辑,发现了一个问题:protobuf3的基本类型不支持nullable。如果想表达“没有...

11320
来自专栏从流域到海域

《笨办法学Python》 第31课手记

《笨办法学Python》 第31课手记 本节课是一小段类似《龙与地下城》的游戏的代码,是if语句嵌套的深入,即嵌套的if语句中又出现嵌套的if语句。理论上可以嵌...

20970
来自专栏码代码的陈同学

异常处理的反模式

异常设计实践 中有位读者评论:又记录日志又抛异常反模式设计。其实我并不知道反模式,本文是对于反模式的学习整理,数据都来自参考资料。

18950
来自专栏C语言及其他语言

[每日一题]循序渐进思考

相信大家经常会遇到自己想不透的问题,这个时候可能就需要看一下别人写的代码,从中借鉴他的思想和方法,今天小编想要告诉大家的就是如何去看别人的代码,借鉴别人的思想 ...

32280
来自专栏令仔很忙

设计模式六大原则——开放封闭原则(OCP)

      1、对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

24030
来自专栏玄魂工作室

CTF实战30 CTF题目练习和讲解五(讲解部分)

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

23630

扫码关注云+社区

领取腾讯云代金券