面向对象的设计原则
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)、依赖注入
- 针对接口编程,不要针对实现编程
- 违反依赖倒置原则:
- 应用依赖倒置原则:
启发式原则
“依赖于抽象”——程序中所有依赖关系都应该终止于抽象类或者接口
启发式原则:
- 任何变量都不应该拥有指向具体类的指针或者引用
- 任何类都不应该从具体类派生(可以继承抽象类,实现接口类)
- 任何方法都不应该改写其任何基类中已经实现的方法
结构化设计与面向对象设计的区别
结构化设计
上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。
面向对象设计
依赖倒转:一般情况下抽象的变化概率很小,让客户类依赖于抽象,实现的细节也依赖于抽象。
即使实现细节不断变动,只要抽象不变,客户程序也不需要变化。这大大降低了客户程序与实现细节的耦合度。