Skip to content

面向对象

面向过程

关心该怎么做,一步一步实现这个功能

面向对象

关心该让谁去做,调用对象的操作来实现这个功能

面向对象 = 对象 Object + 分类 Classification + 继承 Inheritance + 通过消息的通信 Communication with Messages

组成

  • 定义了一组大体上类似的对象
  • 类包含的方法、数据描述了一组对象的共同行为和属性
  • 类是对象之上的抽象,对象是类的具体化(实例)
  • 分类
    • 实体类,现实生活中真实的实体
    • 接口类(边界类),为用户提供与系统合作交互的方式
    • 控制类,控制活动流,充当协调者

对象

  • 由对象名、属性(数据/状态/成员变量)、方法组成

消息

  • 定义:对象之间进行通信的一种构造
  • 发送消息的对象不需要知道接收消息的对象如何对请求予以响应

方法重载

一个类可以具有多个重名而参数类型列表不同的方法。

  • 方法名相同 参数个数不同
  • 方法名相同 参数类型不同
  • 方法名相同 参数类型顺序不同

面向对象的特征

封装

  • 封装是一种信息屏蔽技术,目的是使对象的使用者和生产者分离,定义与实现分开。

继承 extends

  • 定义和实现一个类时,可以基于已存在的类进行,将已定义的内容作为自己内容并加入新的内容。
  • 继承关系中,子类将拥有父类的非私有化属性和方法
  • 单重继承:只有一个父类。多重继承:有两个以上父类。
  • 多重继承时,可能造成子类中存在二义性的成员

多态

不同对象收到同一消息产生完全不同的结果。

多态依赖于继承。

java
Person zst = new Student();
// 编译时看等号左边 zst是person类
// 运行时看等号右边 zst是student类

class Person {
  target () {}
}

class Student extends Person {
  public void target () {
    System.out.println('more score')
  }
}

class Worker extends Person {
  public void target () {
    System.out.println('more money')
  }
}

function getTarget (person) {
  person.target()
}

getTarget(new Student())
getTarget(new Worker())
  • 多态的形式
    • 通用的
      • 参数的,最纯的多态
      • 包含的,在许多语言都存在,最常见的例子是子类型化
    • 特定的
      • 过载的,同一个名字在不同上下文表示的含义不同
      • 强制的
  • 在面向对象方法中,多态是指客户端无需知道所调用方法的特定子类的实现

动态绑定

  • 绑定是一个把过程调用和响应调用所需执行的代码加以结合的过程。
  • 静态绑定在编译时进行;动态绑定在运行时进行。
  • 动态绑定是和类的继承以及多态相联系的。

面向对象设计原则

  • 单一责任原则,一个类应该只有一个引起它变化的原因
  • 开放-封闭原则,软件实体(类、模块、函数等)应该对扩展开放,对修改关闭
  • 里式替换原则,子类对象能够替换掉它们的基类对象
  • 依赖倒置原则,高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
  • 接口分离原则,客户端不应该依赖它不需要的接口,依赖于抽象,不要依赖于具体。

以上为五大原则

  • 共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的。变化对一个包产生影响,则对包中所有类产生影响。
  • 共同重用原则,一个包中的所有类应该是共同重用的。重用包里的一个类,就要重用包中所有类。

面向对象分析

包含5个活动

  • 认定对象,定义问题域,寻找系统关心的实质性对象
  • 组织对象,分析对象间关系,抽象成类
  • 对象间相互作用,描述出各对象在应用系统中的关系
  • 确定基于对象的操作
  • 定义对象的内部信息

面向对象设计

基于面向对象分析的分析模型转化为设计模型,目的是定义系统构造蓝图。理解解决方案,实现系统细节

对应如下五个活动

  • 识别类及对象
  • 定义属性
  • 定义服务
  • 识别关系
  • 识别包

面向对象测试

四个层次:

  • 算法层,类中的每个方法
  • 类层,类中的方法、属性
  • 模版层,类的相互作用
  • 系统层,组装后的系统进行测试

📒 从题中的总结

  • 面向对象分析不需要考虑系统测试问题
  • 面向对象分析忽略与系统实现有关的问题

面向对象程序设计

没啥更多的内容

📒 从杂题中的总结

  • 类的静态方法只能访问该类的静态数据成员;静态数据成员可被该类所有方法访问;类的实例化对象共享静态数据成员的值。
  • 领域类模型中包含属性、操作、关联
  • 面向对象方法进行软件开发时,分析阶段,架构师主要关注系统的行为