使用关系

对象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. OD~~helloworld

    要爆破的C程序源码: #include <stdio.h> int main() { int x; scanf("%d",&x); ) printf(" ...

  2. Python学习笔记(四十八)POP3收取邮件

    收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python内置一个poplib模块,实现了POP3协 ...

  3. python 操作PPT练习

    from pptx import Presentation from pptx.util import Pt, Inches prs = Presentation() slide = prs.slid ...

  4. 不用注解添加controller抛出No adapter for handler异常

    不用注解添加controller时会抛出No adapter for handler异常. 解决方法:在DispatcherServlet的配置文件(***-servlet.xml)中加入如下两行: ...

  5. 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 ...

  6. React Native 与 夜神模拟器的绑定

    之前一直用真机去调试, 每回更新一次都需要手动摇晃手机后才能reload JS, OMG,太麻烦了. 后来寻思模拟器网上推荐用Geny...什么的模拟器,但是那个模拟器还需要VBox一起用. 有点麻烦 ...

  7. 设计模式之Adapter

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: 将两个不兼容的类纠合在一起使用,属于结构型模式,也有人称它为wrapper(包装类). 包装类 ...

  8. SQL server(到主机的TCPIPl连接失败的问题)

    1 首先要做的是在sql新建查询里输入 exec sys.sp_readerrorlog 0, 1, 'listening' 运行后 会显示你的sql 正在运行的tcp/ip接口 看看是否和你java ...

  9. C语言回调函数总结

    /* Main program ---calls--> Library function ---calls--> Callback funtion */ #include <stdi ...

  10. 在Linux(CentOS)中安装.netcore SDK

    官方链接 :https://dotnet.microsoft.com/download/linux-package-manager/centos/sdk-current 可以直接根据官方链接,选择Li ...