理解设计模式中类的关系

设计模式系列课程02之【类的关系详细理解】 转自:://blog.youkuaiyun.com/zhengzhb/article/details/7187278 在Java以及其他面向对象设计模式中,类与 阅读详情

1.设计模式类中的关系

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

1. 依赖(Dependence) 

        依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。类上面的图例中:People类依赖于Book类和Food类,Book类和Food类是作为类中方法的参数形式出现在People类中的。

代码样例:

[java]  view plain copy
  1. public class People{  
  2.     //Book作为read方法的形参  
  3.      public void read(Book book){  
  4.         System.out.println(“读的书是”+book.getName());  
  5.     }  
  6. }  

2.关联(Association)、、

单向关联:

 

双向关联:

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

代码样例:

[java]  view plain copy
  1. public class Son{  
  2.    //关联关系中作为成员变量的类一般会在类中赋值  
  3.     Father father = new Father();  
  4.     public void getGift(){  
  5.         System.out.println(“从”+father.getName()+”获得礼物”);  
  6.     }  
  7. }  
  8.   
  9. public class Father{  
  10.     Son son = new Son();  
  11.     public void giveGift(){  
  12.         System.out.println(“送给”+son.getName()+“礼物”);  
  13.     }  
  14. }  

3.聚合(Aggregation)

        聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。

代码样例:

[java]  view plain copy
  1. public class People{  
  2.     Car car;  
  3.     House house;   
  4.     //聚合关系中作为成员变量的类一般使用set方法赋值  
  5.      public void setCar(Car car){  
  6.         This.car = car;  
  7.     }  
  8.     public void setHouse(House house){  
  9.         This.house = house;  
  10.     }  
  11.   
  12.     public void driver(){  
  13.         System.out.println(“车的型号:”+car.getType());  
  14.     }  
  15.     public void sleep(){  
  16.         System.out.println(“我在房子里睡觉:”+house.getAddress());  
  17.     }  
  18. }  

4.组合(Composition)

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

[java]  view plain copy
  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图例中,实现关系用虚线+空心箭头表示,箭头指向接口。

        在java中继承使用extends关键字,实现使用implements关键字,很直观。就不代码演示了。



2.对依赖、关联、聚合和组合之间区别的理解


      在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的,但是基本相同并不等于完全相同,这一点在我的前一篇博文《设计模式中类的关系》中已经有所提及,下面就来详细的论述一下在java中如何准确的体现依赖、关联、聚合和组合。

首先看一看书上对这四种关系的定义:

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

——摘自《Java面向对象编程》,作者:孙卫琴

       以上关系的耦合度依次增强(关于耦合度的概念将在以后具体讨论,这里可以暂时理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强)。由定义我们已经知道,依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,而组合则是一种更强的关联,所以笼统的来区分的话,实际上这四种关系、都是关联关系。

        依赖关系比较好区分,它是耦合度最弱的一种,在java中表现为局域变量、方法的形参,或者对静态方法的调用,如下面的例子:Driver类依赖于Car类,Driver的三个方法分别演示了依赖关系的三种不同形式。

[java]  view plain copy
  1. class Car {  
  2.     public static void run(){  
  3.         System.out.println("汽车在奔跑");  
  4.     }  
  5. }  
  6.   
  7. class Driver {  
  8.     //使用形参方式发生依赖关系  
  9.     public void drive1(Car car){  
  10.         car.run();  
  11.     }  
  12.     //使用局部变量发生依赖关系  
  13.     public void drive2(){  
  14.         Car car = new Car();  
  15.         car.run();  
  16.     }  
  17.     //使用静态变量发生依赖关系  
  18.     public void drive3(){  
  19.         Car.run();  
  20.     }  
  21. }  

        关联关系在java中一般使用成员变量来实现,有时也用方法形参的形式实现。依然使用Driver和Car的例子,使用方法参数形式可以表示依赖关系,也可以表示关联关系,毕竟我们无法在程序中太准确的表达语义。在本例中,使用成员变量表达这个意思:车是我自己的车,我“拥有”这个车。使用方法参数表达:车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。

[java]  view plain copy
  1. class Driver {  
  2.     //使用成员变量形式实现关联  
  3.     Car mycar;  
  4.     public void drive(){  
  5.         mycar.run();  
  6.     }  
  7.     ...  
  8.     //使用方法参数形式实现关联  
  9.     public void drive(Car car){  
  10.         car.run();  
  11.     }  
  12. }  

        聚合关系是是一种比较强的关联关系,java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中

[java]  view plain copy
  1. class Driver {  
  2.     //使用成员变量形式实现聚合关系  
  3.     Car mycar;  
  4.     public void drive(){  
  5.         mycar.run();  
  6.     }  
  7. }  


        假如给上面代码赋予如下语义:车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。

假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法

[java]  view plain copy
  1. public Driver(Car car){  
  2.     mycar = car;  
  3. }  


        所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。


《寻秦OL》.ani动画逆向解析:二进制结构与Unity重实现 动画文件格式是游戏资源逆向的核心入口,其本质是一组按特定规则组织的二进制数据流。理解魔数识别、字节序、字段对齐与差分编码等底层原理,是解析非标准格式的关键前提。技术价值在于绕过黑盒协议,直接从静态客户端提取可验证的原始语义;典型应用场景包括老游戏复刻、美术资产抢救、引擎跨平台迁移及教学级逆向训练。本文以《寻秦OL》的`.ani`文件为实例,深入剖析其C风格结构布局、GB2312中文命名、16位定点数旋转表示及帧主序差分存储机制,并基于C#在Unity中完成从字节流到AnimationClip的端到端重建,覆 阅读详情

相关推荐

SAP License USMM SLAW2 SAP审计

引言 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安装的SAP系统需要进行测定。 关键字: SAP License、 SAP USMM、 SLAW2、 SAP 账号、SAP 账号审计、 SAP License 审计、 SAP 审计报告、SAP 账号优化 SAP License审计邮件 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安...

感悟人生 2975

谈一谈自己对依赖、关联、聚合和组合之间区别的理解

在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的,但是基本相同并不等于完全相同,这一点在我的前一篇博文《设计模式中类的关系》中已经有所提及,下面就来详细的论述一下在java中如何准确的体现依赖、关联、聚合和组合。 首先看一看书上对这四种关系的定义:...

yuanlanjun 835

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3013

面向对象的6种关系:关联,聚合,组合,泛化,依赖,实现

1.单项关联Association 一个类的实例Customer使用另外一个类的实例Address,这两个对象之间为关联关系。 public class Customer { private Address address; private String name; public String getName() { return name; } public Address getAddress() { retur

wdxzuishuia的博客 7547

Exchange 2013/2016/2019修改附件大小限制

Exchange 2013/2016/2019邮件大小限制 可以在三个位置上配置Exchange上的默认邮件大小限制: 组织传输设置 发送/接收连接器设置 用户邮箱设置 1.打开Exchange Management Shell 使用命令查看默认限制 get-transportconfig | ft maxsendsize, maxreceivesize get-receiveconnector | ft name, maxmessagesize get-sendconnector | ft

高级基础架构专家-Hunter 6095

【Android逆向工程】第17章:反调试与反 Hook 对抗技术

本文介绍了Android应用常见的反调试技术及其对抗策略。主要内容包括: 反调试技术概述 分类:进程检测(ptrace、TracerPid)、文件检测、行为检测(时间/断点)、内存检测、框架检测 对抗思路:识别检测点→Hook检测函数→修改返回值→隐藏工具特征 ptrace检测实现 原理:利用ptrace系统调用检测调试器附加 实现方式:直接检测、持续线程检测、fork子进程检测 绕过方法:Frida Hook ptrace函数返回0,或使用LD_PRELOAD注入假函数 综合防护 涉及多种检测技术的组合使

w987333120的博客 359

UML 类关系(详解)——依赖、关联、聚合、组合、泛化

UML

抽象的螺旋 3004

【CicadaPlayer】av_rescale_q 学习:转换PTS和Duration

参考 av_rescale_q()理解 大神时间基准的总结: AVPacket下的pts和dts以AVStream->time_base为单位(数值比较大),时间间隔就是AVStream->time_base。 大神:多种转换的总结 av_rescale_q用于计算Packet的PTS 如: if (pkt->pts != AV_NOPTS_VALUE) { pkt->pts = av_rescale_q(pkt->pts, m

突围 840

Java类之间的关联关系

Java类之间的关联关系 UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。 一、泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。 一般用一个带空心箭头的实线表示泛化关系,UML图如下: 泛化对应Java中继承关系,即子类继...

as123588的专栏 1090

A133在Android13上适配百兆以太网

NOTE] 【技术支持问题】问题背景/平台。

mangofu的博客 412

3、★☛基于STM32的手机通过wifi控LED灯√♠★

3、基于STM32的手机通过wifi控LED灯 文章目录3、基于STM32的手机通过wifi控LED灯1、Introduce介绍1.1、课题背景及其意义1.2、 国内外的研究状况2、方案的设计2.1、控制方案的确定2.2、控制方式的选择2.2.1、 单片机芯片的选择方案一方案二方案三方案四2.2.2、无线遥控模块的选择方案一方案二方案三3、硬件电路的设计3.1、系统的功能分析及体系结构设计3.1.1、系统功能分析3.1.2、系统总体结构3.2、模块电路的设计3.2.1、 STM32单片机核心电路设计3.2.

行走的皮卡丘 2960

UML中关联、依赖、聚集等关系的异同

 1.  关联:连接模型元素及链接实例,用一条实线来表示;2.  依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;3.  聚集:表示整体与部分的关系,用一条实线加空心菱形来表示;4.  组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;             (关联,依赖,聚集,组成的异同见后描述)5.  泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来

百善孝为先 1511

Python 爬虫实战:亚马逊 + eBay 商品信息跨平台抓取(价格 / 销量 / 评价对比)

亚马逊和 eBay 是全球知名的电商平台,拥有海量的商品信息。对于消费者来说,比较不同平台上的商品价格、销量和用户评价可以帮助他们找到性价比最高的商品。对于商家而言,了解竞争对手的商品信息有助于优化自身的产品策略和定价策略。然而,手动在两个平台上逐一比较商品信息是非常耗时且低效的。因此,开发一个能够自动抓取并对比这两个平台商品信息的爬虫工具具有重要的实际意义。

yansideyucsdn的博客 615

对于java设计模式6大原则的另类理解及类与类的关系

换种方式理解设计模式原则

m0_50302965的博客 519

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大话设计模式阅读(1) UML类图各种关系与代码的对应理解

1、继承:代码略去 2、实现接口:略去 3、关联关系:一个类(箭头起点的类)中包含另一个类(箭头所指的类)的对象成员 class Penguin    //企鹅类关联气象类 {     private Climate climate; } 4、聚合关系:一种弱的拥有关系,一个类包含另一个类(箭头所指的类)的成员集合

花开无言 821

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

类图

瞻仰《设计模式之禅》这本书的时候,每种模式都会给出实现时对应的类图。看不懂类图,相当苦闷。 理解对应的类图,也更方便理解模式。 类图是常用的一种UML图。用以展示类、接口以及它们之间静态关系。 类图主要包含的组成元素:包(package)、类(class)、接口(interface) 待续。。。 转载于:https://www.cnblogs.com/jobshunter/p/...

daxian6337的博客 181

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图

本文详细讲解和梳理UML类图,并介绍通过为IDEA安装PlantUML Intergration插件实现UML类图的绘制,为后续设计模式的讲解做铺垫。本文所有代码都是以JAVA语言为例

Mekeater的博客 2万+

【第一天】设计模式之基础-UML类图与设计模式七大原则

目录前言一、UML类图如何表示一个类?二、UML类图如何表示类与类之间的关系?1、泛化关系代码案例2、实现关系代码案例3、关联关系代码案例4、聚合关系代码案例5、组合关系代码案例6、依赖关系代码案例总结 前言 UML类图用来表示类与类之间的关系,是一种静态图(区别于对象图,对象图描述的是某一时刻对象与对象之间的关系)。能够理解UML类图,是学习设计模式的基础,看懂了类图,就能够更好的理解设计模式,学习起来事半功倍。 一、UML类图如何表示一个类? 一个类图从上到下分别表示类名、 属性、方法,在属性和方法前

壮乡码农 450

从设计模式反推UML类图:以工厂模式和观察者模式为例,理解类关系与代码的映射

本文通过工厂模式和观察者模式的代码实例,逆向推导UML类图,帮助开发者理解类关系与代码的映射。详细解析了依赖关系、关联关系等UML元素在代码中的表现,并提供了实战案例和常见陷阱的验证方法,提升设计模式与UML的应用能力。

weixin_33326218的博客 319

idea 看类的子类 uml 图_[UML]Java之UML类图

准备新开一个坑,重新介绍一下Java的设计模式。在介绍设计模式之前,想先此篇介绍一下UML类图,熟悉UML类图也方便理解设计模式中各个类的关系和结构。网上找到一篇很好的讲解UML的文章,现转载过来。原文在这里UML中的类图及类图之间的关系​c.biancheng.netUML统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被...

weixin_39831493的博客 881

学编程设计模式前必须要先掌握的知识——类图和类之间的关系

学编程设计模式前必须要先掌握的知识——类图1. 类2. 接口3. 类图4. 类之间的关系4.1 依赖关系4.2 关联关系4.3 聚合关系4.4 组合关系4.5 泛化关系4.6 实现关系 之前只了解设计模式的一些皮毛,但是整体看文章和一些设计模式的基础知识的时候总会有一些名为“类图”的东西首先介绍某设计模式的各结构之间的关系,下面对类图进行一下学习,更方便的去阅读设计模式的一些文章吧。 1. 类 类(Class)是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,

kuanyew的博客 947

设计模式:UML 类图

设计模式:UML 类图

ProgramNovice的博客 1111

uml 类图_[UML]Java之UML类图

准备新开一个坑,重新介绍一下Java的设计模式。在介绍设计模式之前,想先此篇介绍一下UML类图,熟悉UML类图也方便理解设计模式中各个类的关系和结构。网上找到一篇很好的讲解UML的文章,现转载过来。原文在这里UML中的类图及类图之间的关系​c.biancheng.netUML统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被...

weixin_39968722的博客 81

设计模式-UML类图详解

实现关系泛化关系关联关系聚合关系组合关系依赖关系。

日常技术分享 1588

java设计模式之观察者模式

观察者模式描述的是类与类之间的关系,重要是理解它的思想。

徐志摩的博客 258

23种设计模式类图的理解

本文通过设计模式目的、设计模式七大原则和UML类图出发。让读者根据类图理解设计模式好处和目的。

m0_53228285的博客 515
上一篇: Access denied for user 'root'@'localhost' (using password:YES) 解决方案
下一篇: 设计模式的六大原则
CEJ-盐井
博客等级 码龄17年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值