使用关系

对象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. sqlserver 2008备份与还原

    一.SQL数据库的备份: 1.依次打开 开始菜单 → 程序 → Microsoft SQL Server 2008 → SQL Server Management Studio → 数据库:Dside ...

  2. [LeetCode] 23. Merge k Sorted Lists ☆☆

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...

  3. uva 10288 Coupons (分数模板)

    https://vjudge.net/problem/UVA-10288 大街上到处在卖彩票,一元钱一张.购买撕开它上面的锡箔,你会看到一个漂亮的图案. 图案有n种,如果你收集到所有n(n≤33)种彩 ...

  4. hadoop之安全篇

    ---------------持续更新中------------------- hadoop集群安全架构 如下图所示: --------------------------未完待续---------- ...

  5. (转)使用Excel批量给数据添加单引号和逗号

    在使用PLSQL连接oracle数据库处理数据的过程中,常用的操作是通过ID查询出数据,ID需要附上单引号,如果查询的ID为一条或者几条,我们手动添加即可,但是如果是几百条.几千条的话,就需要使用一些 ...

  6. 那些相见恨晚的 JavaScript 技巧

    JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript ...

  7. 更改gradle的java的class文件输出目录的结构

    group 'com.thinkvenus.common'version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 r ...

  8. 【BZOJ】3963: [WF2011]MachineWorks

    [题意]给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器.给定初始钱数c和总天数T,求最大收益.n<=10^5 ...

  9. fetch and js异步介绍

    http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html   Javascript异步编程的4种方法 ht ...

  10. WebStorm 2016激活

    最近在网上找到一个激活webStorm 的好东西.博主说对jetbrains下的所有产品都是可以用这种方式激活的...如:PhpStorm,IntelliJ JDEA等. 但别的产品我没有试过.对于w ...