软件工程概念

软件工程概念

面向对象之间的关系

泛化关系

  1. 即java中的继承关系
  2. 箭头表示

1744620349981-596662fa-49e5-4511-8a93-2f70905a63c5.png

实现关系

  1. 即java中接口的实现关系(implement)
  2. 箭头表示

1744620384808-5705e3f3-29c0-4fee-87c0-0c4d07705416.png

依赖关系

  1. b类作为a类的方法的参数传入,那么a就依赖b类
  2. 箭头表示

1744620411944-5bb716e5-7819-4bb3-a391-1b14dc5bb542.png

关联关系

  1. a类中的成员变量为b类,则a关联了b类,
  2. 关联关系仅仅表示两者有关系,而无需关心对方的生命周期
  3. 箭头表示

1744620424404-a949b394-2207-4512-888e-87b128b4ce13.png

聚合关系

  1. 关联关系的进阶版,强调拥有,同样无需关系双方的生命周期
  2. 如班级和学生之间的关系,一个班级拥有一个学生,但是一个学生被移除出这个班级,他还是一个学生
  3. 箭头表示

1744620449361-f14eaf10-7ef3-4d1a-91b6-a738bc8a7b1b.png

组合关系

  1. 聚合关系的更进阶版,同样强调拥有,但是双方的生命周期高度绑定,两者之间的关系更加的紧密
  2. 如房子和房间之间的关系,房子拥有房间,但是房间不能脱离房子存在,没有房子就没有房间
  3. 箭头表示

1744620460667-6df09fed-fe4e-4b5f-bb0a-5f81c9fa88ff.png

怎么区分关联关系,聚合关系,组合关系

  1. 是否强调拥有,
      1. 即为关联管理
      1. 是否强调生命周期有关联
          1. 聚合关系
          1. 组合关系

面向对象的设计原则

单一职责原则

  1. 定义
    1. 即一个对象应该只有一个职责,而不应该承担过多的原则
  2. 例子
    1. 如一个商品列表的功能,不应该把商品的存储移除和商品的遍历混合在一起
    2. 正确的应该是利用迭代器模式,创建迭代器来对商品进行遍历
  3. 好处
    1. 可以避免一个对象承担过多的职责,使得系统的复杂度过高,可以降低系统的耦合度

开闭原则

  1. 定义
    1. 即对扩展开放,对修改封闭
    2. 即系统可以在不修改现有代码的情况下扩展功能
  2. 例子
    1. 装饰器模式
      1. 如java中的管道流操作,定义了一个顶级的抽象管道流,其他类都是他的子类,我可以通过装饰器对某一个管道进行装饰,详细请看设计模式解析中的装饰器模式
    2. 工厂模式
    3. 抽象工厂模式
  3. 好处
    1. 可以避免修改系统源代码,保证系统原有功能可以正常运行,
    2. 可以更加简单的进行系统功能进行扩展

里氏替换原则

  1. 定义
    1. 子类可以完全替代父类,子类必须完全实现父类的所有操作,然后再在此基础上进行修改,
  2. 例子
    1. 同样的装饰器模式也符合里氏替换原则
    2. 如java中的管道流操作,定义了一个顶级的抽象管道流,其他类都是他的子类,我可以通过装饰器对某一个管道进行装饰,详细请看设计模式解析中的装饰器模式
  3. 好处
    1. 更侧重保护系统的原有功能,然后再去扩展系统功能

接口隔离原则

  1. 定义
    1. 注重的是对象和接口之间的解耦,即每个接口都不应该承担过多的职责,每个接口都被设计为较小的粒度的功能,
    2. 每个对象只需要实现对应小粒度的接口就行,而不需要一个全能的几口
    3. 和单一职责原则有点类似,只不过这个是对接口的
  2. 例子
    1. 抽象工厂模式

依赖倒置原则

  1. 定义
    1. 高层次的抽象接口不应该依赖低层次的具体接口,但是低层次的具体实现需要依赖高层次的抽象接口
    2. 参考依赖关系,即方法的参数中是别的对象即位依赖关系
    3. 即具体的实现方法需要的参数类型为高层次的抽象接口对象
  2. 例子
    1. 几乎所有设计模式都使用了依赖倒置原则

合成复用原则

  1. 定义
    1. 优先使用对象之间的组合(参考组合关系)来实现对功能的服用,而不是使用继承关系来使用某个功能
  2. 好处
    1. 这样可以避免一个类继承过多的功能,增加系统的耦合性,
    2. 使用合成复用原则可以只使用组合的对象的某个功能即可,而不用继承

最少知识原则(迪米特法则)

  1. 定义
    1. 每个类应该只与和自己有直接关系的类发生功能的交互,而不应该调用某个类的更底层的其他类的功能
    2. 即如果可以通过第三方间接的调用第三个类,那么就尽量使用间接的方式
  2. 例子
    1. 如果你想买房子,你不应该直接去找房东,而是找中介,让中介来帮你联系适合你的房东
  3. 好处
    1. 可以避免过度耦合

更新: 2025-04-14 19:48:05
原文: https://www.yuque.com/duifangzhengzaishuru-rqbua/axyc58/piyquc5agu2bn9qt