面向对象设计的六大原则
- 单一职责原则(SRP) Single Responsibility Principle
- 开闭原则(OCP) Open Closed Principle
- 里氏替换原则 (LSP老色批原则) Liskov Substitution Principle
- 依赖倒置原则(DIP) Dependence Inversion Principle
- 接口隔离原则(ISP) Interface Segregation Principle
- 迪米特原则(LOD) Law of Demeter
单一职责原则
单一职责原则,Single Responsibility Principle,简称SRP。其定义是应该 有且仅有一个类引起类的变更 ,这话的意思就是一个类只担负一个职责。( 一个职责的接口是可以有多个方法的)
单一职责原则的优点:
- 类的复杂性降低,实现什么职责都有明确的定义;
- 逻辑变得简单,类的可读性提高了,而且,因为逻辑简单,代码的可维护性也提高了;
- 变更的风险降低,因为只会在单一的类中的修改。
开闭原则
开闭原则,Open Closed Principle,是Java世界里最基础的设计原则,其定义是:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
一个软件实体应该通过扩展来实现变化,不应对已有代码进行修改来实现变化
遵循开闭原则的最好手段就是抽象或接口
里氏替换原则
里氏替换原则,英文名Liskov Substitution Principle,它的定义是
如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有对象o1都替换成o2的时候,程序P的行为都没有发生变化,那么类型T2是类型T1的子类型。
简单的定义:
只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何异常。 并且子类可以扩展父类没有的功能,同时子类还不能改变父类原有的功能。
四个规范
1、子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
2、子类可以有自己的属性和方法。
3、子类覆盖或重载父类的方法时输入参数可以被放大。
4、子类覆盖或重载父类的方法时输出结果可以被缩小,也就是说返回值要小于或等于父类的方法返回值。
确保程序遵循里氏替换原则可以要求我们的程序建立抽象,通过抽象去建立规范,然后用实现去扩展细节,所以,它跟开闭原则往往是相互依存的。
依赖倒置原则
依赖倒置原则,Dependence Inversion Principle,简称DIP,它的定义是:
高层模块不应该依赖底层模块,两者都应该依赖其抽象;
抽象不应该依赖细节;
细节应该依赖抽象;
底层模块:不可分割的原子逻辑,高层模块:原子逻辑的再组装
抽象就是指接口或抽象类,两者都不能被实例化;而细节就是实现接口或继承抽象类产生的类,也就是可以被实例化的实现类。依赖倒置原则是指模块间的依赖是通过抽象来发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口是来实现的。
接口隔离原则
客户端不应该依赖它不需要的接口,一个接口一个功能
迪米特原则
迪米特原则,Law of Demeter,简称LoD,也被称为最少知识原则,它描述的规则是:
一个对象应该对其他对象有最少的了解
一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大,这也是我们面向设计的核心原则:低耦合,高内聚。
迪米特法则还有一个解释:只与直接的朋友通信。
迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。
两个优点
- 降低了类之间的耦合度,提高了模块的相对独立性。
- 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。
但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。