设计模式 面向对象设计七大原则
单一职责原则: 类的职责要单一,不要将太多的职责放在一个类中
开闭原则: 软件实体对扩展是开放的,但对于修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能
里氏代换原则: 在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象
依赖倒转原则: 要对抽象层编程,不要针对具体类编程
接口隔离原则: 要使用多个专门的接口,不要使用同意的接口
合成复用原则: 在系统中要尽量使用组合和聚合关联模式,少使用甚至不使用继承关系
迪米特法则: 一个软件实体对其他实体的引用越少越好
1.单一职责原则
定义:
一个对象应只包含单一职责,并且职责被完整的封装在一个类中.
分析:
类的职责有两个方面:数据职责,行为职责,数据职责由属性体现,行为职责有方法体现.一个职责可能影响其他职责,因此要将职责分离,封装到不同类中.
单一职责原则是实现"高内聚,低耦合"的指导方针.
2.开闭原则
定义:
一个软件实体应当对扩展开放,对修改关闭.
分析:
开闭原则是面向对象可复用性设计的一块基石,抽象化设计是开闭原则的关键.
开闭原则注重的是无需对抽象层进行改动,只需要增加新的具体类来实现新的业务.
开闭原则可以通过"对可变性封装原则"来描述,即找到系统的可变因素将其封装起来.
百分百的开闭原则是很难做到的.
3.里氏代换原则
定义:
所有引用基类的地方,必须能透明的使用其子类的对象.
分析:
里氏代换原则是实现开闭原则的重要方式
软件中能使用基类对象的地方一定能使用其子类对象,反之不成立.
要尽量使用基类类型对对象定义,运行时在确定其子类类型,用子类替换父类.
子类的所有方法必须在父类中声明,子类必须实现父类中声明的所有方法
尽量把父类设计为抽象类或接口,让子类继承或实现父类.
4.依赖倒转原则
定义:
高层模块不应该依赖于底层模块,他们都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象
即要针对接口编程,不要针对实现编程
分析:
代码要依赖于抽象类,不要依赖于具体类,要针对接口或抽象类编程,而不是针对具体类编程.
开闭原则是面向对象设计的目标,依赖倒转原则是面向对象设计的主要手段
依赖倒转原则是Spring等技术和框架后的基本原则之一
类之间的耦合:
(1)零耦合:两个类没有任何耦合关系
(2)具体耦合:发生在两个具体类中,有一个具体类对另一个具体类的实例的直接引用产生.
(3)抽象耦合:发生在一个具体类和一个抽象类(也可以两个抽象类)中,由于抽象耦合中至少有一个是抽象的所以可以通过不同的实现进行扩展.
依赖倒转原则就是要求客户端依赖于抽象耦合,这是依赖倒转原则的关键.
5.接口隔离原则
定义:
客户端不能依赖那些它不需要的接口
分析:
要使用多个专门的接口,而不要使用单一的总接口
拆分接口时,要符合单一职责原则,接口中的方法越少越好
6.合成复用原则
定义:
要尽量使用对象组合,而不是继承来达到复用的目的
分析:
通过继承来实现复用很简单,而且子类可以覆盖父类方法,易于扩展.但是继承复用会破坏系统的封装性,会将实现的细节暴露给子类.
通过组合/聚合来复用,是将一个类的对象作为另一个类的对象的一部分,成员对象的内部细节对于新对象是不可见的,耦合度相对较低.
从基类继承来的实现时静态的,而合成服用可以在运行时动态的进行,新对象可以动态的引用与成员对象类型相同的其他对象.
7.迪米特法则
定义:
一个软件实体应当尽可能少的与其他实体发生相互作用
分析:
如何两个类之间不必彼此直接通信,那么这里两个类就不应当发生直接相互作用,可以通过第三者转发这个调用.
简单来说,不要和"陌生人"说话,要和你的直接"朋友"通信