面向对象设计原则详细讲解

Object-Oriented Design Principles(面向对象的设计原则)

LSP:Liskov替换原则

The Liskov Substitution Principle

  • 子类不能添加任何父类没有的附加约束

  • 子类对象必须可以替换超类对象

  • 例:不能使用正方形类继承长方形类,因为正方形类中对长和宽具有约束条件。

OCP:开-闭原则

The Open-Close Principle

开闭原则说明软件实体应该对扩展开放,对修改关闭;即在不修改已经存在的源代码的情况下,修改其行为

实现开闭原则的两种策略

策略1:Bertrand Meyer的策略(老方法)

复用实现(代码),而不复用接口。

只有在更正代码错误的情况下才能修改一个类;新增或改变功能需要创建不同的类。

  • 新类通过继承的方式复用原来的类的代码
  • 子类可能与超类可能有不同的接口
    在这里插入图片描述

策略2: 1990年代新思维

复用抽象接口,而不是复用实现(代码)

扫描二维码关注公众号,回复: 15140682 查看本文章

接口不变,通过新增加子类扩展系统功能。

  • 使用抽象接口,其中实现代码可以改变;

  • 可以创建多个实现并以多态方式彼此替换。
    在这里插入图片描述

SRP:单一职责原则

The Single Responsibility Principle

就一个类而言,应该仅有一个引起它变化的原因,也即只能有一个职责。

  • SRP体现了内聚性(Cohesion)内聚性:一个模块的组成元素之间的功能相关性

  • 如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个(相当于一个类只能执行一种职责,执行多个职责,可能不同职责之间就会出现干扰)
    在这里插入图片描述

在这里插入图片描述

ISP:接口隔离原则

The Interface Segregation Principle

客户类不应该被迫依赖于它不需要的方法。

如果在实际应用中,如果只关心某个类中的部分方法,那么其他的方法就造成了接口污染

  • 接口分离原则的意义:根据ISP原则,将很大的接口拆分成较小的,更具体的接口;使得客户类只需要知道它所感兴趣的方法。

  • ISP原则的意图是:使得一个系统保持较低的耦合,以便于更容易重构,修改与部署。

  • 实现方法:将一个大类拆分成具有独立意义的小类
    在这里插入图片描述

DIP:依赖倒置原则

The Dependency Inversion Principle

高层模块不依赖于低层模块,二者都依赖于抽象

又称控制反转(IoC,Inversion of Control)、依赖注入

  • 针对接口编程,不要针对实现编程
  • 违反依赖倒置原则:

在这里插入图片描述

  • 应用依赖倒置原则:
    在这里插入图片描述

启发式原则

“依赖于抽象”——程序中所有依赖关系都应该终止于抽象类或者接口

启发式原则:

  1. 任何变量都不应该拥有指向具体类的指针或者引用
  2. 任何类都不应该从具体类派生(可以继承抽象类,实现接口类)
  3. 任何方法都不应该改写其任何基类中已经实现的方法

结构化设计与面向对象设计的区别

结构化设计

上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。

面向对象设计

依赖倒转:一般情况下抽象的变化概率很小,让客户类依赖于抽象,实现的细节也依赖于抽象

即使实现细节不断变动,只要抽象不变,客户程序也不需要变化。这大大降低了客户程序与实现细节的耦合度。

猜你喜欢

转载自blog.csdn.net/qq_61539914/article/details/127668544