OO的五大原则是指SRP、OCP、LSP、DIP、ISP
SRP(Single Responsibility Principle 单一职责原则)
对象的功能应该单一

OCP(Open Close Principle 开闭原则)
开闭原则是说,所有软件模块都应该可以扩展,但不可以修改。遵循这个原则的关键在于抽象化。我们在写一
个模块时,不论是一个类,还是一个构件,都应该认真思考它的真正功能,它对其它模块的依赖性,输入和输
出,等等。分离出它的可变部分(例如,用接口或外部配置等),对不变部分进行封装。这些不变部分就是这
个模块的本质。这里需要说明的是,在对不变部分进行封装时,我们如何定义不变的部分。在数学中,当我们
谈到不变量时,总是要指明它是在什么变化下的不变量。否则是没有意义的,因为在一种变化下的不变量很有
可能在另一种变化下就不是不变量了。所以,当我们定义不变的部分时,首先要明确它的变化范围。但是,在
软件开发中,很难事先准确的知道这些变化,很多时候是凭经验或行业知识来判断的。所以,这个原则多多少
少带有主观性,更像一个总纲而不像一个硬性的法律条文。
Martin Fowler的书 Analysis Patterns讲解了一些实
际经验,有兴趣的读者可以参考。下面这些原则是讲如何安排依赖性使得模块具有良好的封闭性,可重用性和
可维护性
 

DIP(Dependence Inversion Principle 反向依赖原则)
依赖反向原则是说,要依赖于抽象,而不要依赖于具体。这也就是我们所说的:要针对接口编程,而不要针对
实现编程
。之所以是倒置,是因为通常在开始依照需求编程时,我们几乎总是依赖于具体的实现。但是,这些
具体的实现都不易适应变化,所以要抽象出一些不变的,本质的功能,把可变的留到具体的实现中去。这种抽
象的过程是前面过程的反向,例如,当我们需要写出结果时,开始时可能会写到文件里,后来可能会写到网络
流里,等等。抽象的结果是写这个功能。针对接口编程是一个不可能过分强调的原则。接口就像高楼大厦中层
与层之间,户与户之间的防火墙;大船巨舰中的隔离舱。软件的更新有时就像水火一样难以预料和不可避免
(所以我们叫它软件而不是硬件),而接口会适当地屏蔽软件更新所带来的改动扩散(连锁传播)。通常,类
的依赖性由这个原则和组合
/继承原则主导,而不是由继承主导。

LSP(Liskov Substitution Principle 里氏替换原则)
“老鼠的儿子会打洞”,子类应该具备父类的特征。

ISP(Interface Segregation Principle 接口分隔原则)
尽量提供有针对性符合功能特点的简单接口,而不是包含很多方法的大而总接口。
接口分离原则是说,不相关的功能应在不同的接口里。不然,在需要一个功能时也不得不同时也依赖于另一个
没必要的功能。例如,在早期的 EJB 中,数据库调用和远程调用混在一起,在不需要远程调用时恰好是最糟糕
的组合。这个原则说的是,接口的依赖性宽度越窄越好。