使用关系

对象A的方法MethodA使用了B的方法MethodB,则表示A对B存在使用关系 使用关系的最关键问题在于,A如何找到B,存在6种方案

方案一:

A包含了B,B作为一个成员定义在A的类中,那么在MethodA中可以直接调用B.MethodB()

如汽车可以包含车轮。

如果汽车需要加油,那么就需要调用"加油站B.加油()"

  1. class 汽车
  2. {
  3. 加油站 m_加油站;
  4. 加油(...)
  5. {
  6. //调用某加油站的加油方法
  7. m_加油站.加油();
  8. }
  9. }

那么关键问题在于,汽车如何知道加油站X?

   如果让汽车包含加油站,肯定不合适(太土豪了,呵呵),那么还有以下5种方案:

方案二:       通过形参将加油站传递给调用的方法,那么调用形式就是“加油站.加油()",那么汽车的定义则如下

  1. class 汽车
  2. {
  3. 加油(加油站 X)
  4. {
  5. X.加油();
  6. }
  7. }

方案三:

通过一个第三方类来获得加油站,如地图类,则汽车的定义如下:

  1. class 汽车
  2. {
  3. 加油()
  4. {
  5. 加油站 X=地图.查找一个加油站();
  6. X.加油();
  7. }
  8. }

方案四:

全世界只有一个加油站,那么所有的汽车都到这里来加油,则汽车的定义如下:

  1. class 汽车
  2. {
  3. 加油()
  4. {
  5. 加油站.TheInstance.加油();
  6. }
  7. }

这种情况就是单件模式的例子,还记得它吗?

方案五:

对款爷来说,随时修一个加油站,加完油就推平,这种情况在大部分领域行不通(代价太高),但是在软件领域可以(因为代价很低)

这种情况下,汽车的定义如下:

  1. class 汽车
  2. {
  3. 加油()
  4. {
  5. 加油站 X=new 加油站();
  6. X.加油();
  7. delete X;
  8. }
  9. }

方案六:

汽车制造商在汽车的玻璃上明确标注了,此车只能在名叫"XX加油站",则汽车的定义如下:

  1. class 汽车
  2. {
  3. string 加油站名="XX加油站";
  4. 加油()
  5. {
  6. 加油站 X=企业黄页.查找(加油站名);
  7. X.加油();
  8. }
  9. }

这种方案,在有的地方叫弱引用,汽车并不直接包含加油站,但是包含加油站的一个标示

OOD沉思录 --- 类和对象的关系 --- 使用关系的更多相关文章

  1. OOD沉思录 --- 类和对象的关系 --- 包含关系1

    4.5 如果类包含另一个类的对象,那么包含类应当向被包含的对象发送消息(调用方法).  也就是说,所有的包含关系都应当是使用关系. 如果不是这样,那么包含的类有什么用处呢?当然,面向过程的开发人员会想 ...

  2. OOD沉思录 --- 类和对象的关系 --- 包含关系4

    4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...

  3. OOD沉思录 --- 类和对象的关系 --- 包含关系3

    4.7 类包含的对象数目不应当超过开发者短期记忆数量,这个数目通常应该是6左右 4.8 让系统在窄而深的包含体系中垂直分布 假设有如下两份菜单: 正餐 --->甜瓜 --->牛排 ---& ...

  4. OOD沉思录 --- 类和对象的关系 --- 包含关系2

    4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...

  5. OOD沉思录 --- 类和对象的关系 --- 使用关系原则

    4.1 尽量减少类的协作的数量,即减少使用者和被使用者的数量. 协作意味着一定程度的耦合,但是完全没有协作的类也是没有意义的,最多只能作为一个库使用. 通过抽象,依赖接口,可以最大程度减少依赖的实现类 ...

  6. 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

    (1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...

  7. 【PHP面向对象(OOP)编程入门教程】2.什么是类,什么是对象,类和对象这间的关系

    类的概念:类是具有相同属性和服务的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

  8. php--opp--2.什么是类,什么是对象,类和对象这间的关系

    类的概念:类是具有相同属性和服务的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

  9. OOD沉思录 --- 继承

    一,继承只应被用来为特化层次结构建模 实际上也就是要满足LSP原则,水果类<-榴莲的继承是特化   二,派生类必须知道他们的基类,基类不应当知道他们的派生类   复用的前提   三,基类中的所有 ...

随机推荐

  1. python---Celery分布式任务队列了解

    linux下定时器了解 Celery 框架学习笔记(不错哟) Celery 分布式任务队列快速入门 Celery的最佳实践 一.Celery介绍 Celery 是一个 基于python开发的分布式异步 ...

  2. Vue中使用vux的配置

    一.根据vux文档直接安装,无需手动配置 npm install vue-cli -g // 如果还没安装 vue init airyland/vux2 my-project // 创建名为 my-p ...

  3. 用trigger触发datepicker

    jQuery UI的datepicker没有icon图片,工作需要,自己写了一个,原理是用div包裹住datepicker的input和一个button,隐藏掉input,而button被点击后也可以 ...

  4. LintCode 190: Next Permutation

    LintCode 190: Next Permutation 题目描述 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 ...

  5. Amcharts 柱状图和线形图

    最近需要学习 Amcharts ,他的图表功能确实很强大.但是网上搜索到的教程很少,开始学起的确有点不方便.于是我决定把我学习的觉得好的途径,放到博客上. 下面的代码可以直接复制,但是文件要从官网上下 ...

  6. Docker 配置国内镜像拉取中心,Configure docker to use faster registries in China.

    Networking in China is really bad when it comes to using some cloud based tools like docker, it's us ...

  7. Unity下实现弹簧骨骼(Spring Bone)

    关于这个效果的名称,我一直没找到一个比较正式的说法.Spring Bone这个说法是来自于Anima2D这个插件中的一个演示用的脚本,我直接译成弹簧骨骼. 一般常见于对人物的头发的模拟上. 当然也可以 ...

  8. Paramiko使用

    1.下载安装 pycrypto-2.6.1.tar.gz (apt-get install python-dev) 解压,进入,python setup.py build[编译],python set ...

  9. python初步学习-生成式、生成器、迭代器、装饰器

    生成式 列表生成式 字典生成式 集合生成式 嵌套列表生成式 列表生成式 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.语法格式为 ...

  10. windows和linux修改python的pip源

    python的pip安装包非常方便,然而其默认的镜像源在国外,下载的速度非常慢,推荐改成国内的镜像源. window平台修改pip源 找到系统盘下C:\C:\Users\用户名\AppData\Roa ...