1. 单一职责原则(Single Responsibility Principle, SRP):对于一个类而言,应该只有一个引起它变化的原因。
2. 开闭原则(Open-Closed Principle,OCP): 一个软件实体应当对扩展开放,对修改关闭。既软件实体应尽量不去修改它原有的代码的情况下进行修改。抽象化是关键。
3. 里氏代换原则(Liskov Substitution Principle,LSP):所有引用父类(基类)的地方必须能够透明的使用其子类对象。
4. 依赖倒转原则(Dependency Inversion Principle,DIP):针对接口编程,而不是针对实现编程。
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。它的定义是,抽象不应该依赖于细节,细节应当依赖于抽象。
5. 接口隔离原则(Interface Segregation Principle,ISP):使用多个专门的接口,而不是使用单一的总接口,既客户端不应该依赖那些它不需要的接口。
6. 合成复用原则(Composite Reuse Principle,CRP):尽量使用对象组合,而不是继承来达到复用的功能的目的。
合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的的对象,使之成为一个新的对象的一部分。简言之,复用时要尽量使用组合/聚合关系(关联关系),少用继承。
一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。
"Is-A"是严格的分类学意义上的定义,意思是一个类是另一个类的"一种";
而"Has-A"则不同,它表示某一个角色具有某一项责任。
7. 迪米特法则(Low of Demeter,LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。
如果一个系统符合迪米特法则,
那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,
迪米特法则要求限制软件实体之间通信的宽度和深度。
迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
迪米特法则还有几种定义形式,包括:不要和“陌生人”说话、只与你的直接朋友通信等,在迪米特法则中,
对于一个对象,其朋友包括以下几类:
(1) 当前对象本身(this);
(2) 以参数形式传入到当前对象方法中的对象;
(3) 当前对象的成员对象;
(4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
(5) 当前对象所创建的对象。